刚学 C++ 那阵,把类的成员函数全写在类里面,编译没问题。等工程文件一多,头文件互相包含,立刻报一堆重定义。后来才明白声明和实现要分开放。
类定义的最小骨架
class Box {
public:
double getVolume();
void setLen(double l);
private:
double length = 1.0;
};
class 后面跟类名,花括号里按访问权限分区,最后一定要带分号。public 里的成员谁都能访问,private 只有类内部和友元能碰,protected 留给派生类。不写权限修饰符,默认就是 private。
成员函数写在外面要加作用域
double Box::getVolume() {
return length * length * length;
}
Box 后面两个冒号不能漏,漏了编译器认为你在定义全局函数,会报未声明的标识符。inline 关键字写不写都行,编译器自己会判断,写在类里的函数默认就是内联候选。
构造和析构
构造函数名和类名一样,没有返回类型,可以用初始化列表给成员赋值。析构函数前面加波浪号,对象离开作用域时自动调用,负责释放 new 出来的内存。带虚函数的多态基类,析构函数要声明成 virtual,否则 delete 基类指针时子类资源不会被释放。
写类时容易漏的四点
- 尾部分号:漏一个分号,报错信息往往指向下一个文件,最难查。
- const 成员函数:只读方法后面要加 const,否则 const 对象调不了。
- 深拷贝:成员里有指针就得自己写拷贝构造和赋值运算符。
- 头文件保护:用 #pragma once 或 include guard,防止重复包含。