c++中一个类如果没有自己声明,编译器会为它声明一个拷贝构造函数,赋值拷贝函数,一个析构函数。如果没有声明任何构造函数,会生成一个无参的构造函数。这些函数都是inline,且为public的。
class Test{
};
//相当于
class Test{
Test(){...}
Test(const Test& t){...}
Test& operator = (const Test& t){...}
~Test(){...}
private:
std::string str;
int num;
};
这些函数提供编译器完成一些幕后工作,如base class和非static成员变量的构造函数和析构函数。析构函数是非virtual的,除非自身声明virtual 的析构函数。 拷贝构造函数和赋值拷贝函数只是单纯的将对象的每一个非static成员变量拷贝到目标对象。str会调用string的拷贝构造函数完成拷贝,而num会逐bit拷贝.
而当成员中有引用或者是const 成员,编译器拒绝提供默认的拷贝赋值函数,如成员是string &str, const int num;因为c++不允许改变这些值就不会生成默认的赋值拷贝函数。
如果不希望编译器生成默认的函数,可以将相应的函数声明为私有的并且不实现它。
class Test{
Test(){}
~Test(){}
private:
Test(const Test&);
Test& operator=(const Test&);
};
这时候无法调用拷贝构造函数和赋值拷贝,编译器也不会自动生成。