一个空类的大小不会是0,如果写出了下面这个类,那么编译器也会自动生成一些函数。
class Empty{};
实际上是这样:
class Empty
{
public:
Empty() {..}
Empty(const Empty& this) {..}
~Empty() {...}
Empty& operator=(const Empty& this) {...}
};
当然,如果你自己手动写了这些编译器会生成的默认函数中的一种时,那么编译器将不会生成它。意味着如果你用心设计一个class,其构造函数要求实参,你就无需担心编译器会毫无挂虑地为你添加一个无实参构造函数。
class MyClass { public: MyClass(string s,int val):_s(s),_val(val) {} private: string& _s; const int _val; }; int main() { MyClass a("yes", 1); MyClass b("no", 2); a = b; // 编译器会报错 }
这种情况下,编译器将不会生成默认的赋值重载,所以a=b;这句代码会导致报错。原因是对象中的_s成员是引用,C++不允许让引用改指向不同的对象,而_val是const,更改const成员也是不合法的。