编译器会案子为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。
但是,如果此类的成员类型会导致编译器比较难以理解生成构造函数的样子的时候,编译器会拒绝为其生成默认的成员函数。例如:
class Test
{
private:
std::string& nameValue;
const int objectValue;
};
对于nameValue,c++规定引用是不能修改他指向的对象的,所以c++不知道在赋值构造函数中怎么处理这个成员,所以编译器干脆什么也不错,不再生成默认的赋值构造函数。
同样,对于objectValue,常量并不能被赋值,所以编译器行为同上。
还有一种情况:如果base class将赋值构造函数声明为private,那么编译器也不能为derived class生成赋值构造函数。
因为编译器在生成derived class的赋值构造函数的时候需要调用base class的赋值构造函数来处理base class的成员,而显然,编译器并不能调用private函数。