在一个类中,你没有写任何的构造函数or析构函数or重载运算符=号的函数,则编译器会自动给你创建有这样的函数(默认构造函数 默认析构函数 重载运算符=号的函数,只要它们被需要了或者说被调用了)
学术一点来说,本text就是要明确一个规则,即:
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment运算符的重载函数,以及析构函数。(牢记)
代码如下:
//注意:如果你写下一个空类的话,就会好像写下一个这样的类
class EmptyClass{...};
//equal to this
class EmptyClass
{
public:
EmptyClass() {...};//默认 构造函数
EmptyClass(const EmptyClass& emc) {...};//默认拷贝构造函数
EmptyClass& operator=(const EmptyClass& emc) {...};//默认的重载=号运算符的函数
~EmptyClass() {...};//默认析构函数
};
当然,也唯有这些函数被需要(被调用)时,它们才会被编译器创建出来。程序中需要它们是很平常的事情。下面的codes会造成上述的每一个函数被编译器产出:
Empty e1; //default构造函数 被需要
//default析构函数 被需要
Empty e2(e1); //copy构造函数 被需要
e2 = e1; //copy assignment 操作符 被需要
注意:
1:编译器产出的析构函数的个non-virtual的析构函数,也即你的派生类(子类)无法去重写的!
(除非你这个class的基类(父类)自身声明有virtual的析构函数)
2:至于copy构造函数and copy assignment运算符重载函数 只是单纯的进行浅拷贝(也即单纯地将this->成语属性 = 传入对象-> / . 成员属性)
(传入指针就用->符,传入引用就用.符)
3:构造函数、析构函数、重载=号运算符的函数,但凡你在你的类定义中已经定义了,那么编译器就不会再为你生成一个默认的上述的函数了。
代码如下:
template<class T>
class NamedObject
{
public:
//你自己声明or定义了构造函数,那么IDE就不会再为你生成默认的构造函数:NamedObject() {...}
NamedObject(const char* name,const T& value) {};
NamedObject(const string& name, const T& value) {};
// NamedObject既没有声明copy构造函数,也没有声明copy assignment操作符
//,so编译器会为这个类自动创建这些函数(只要它们被需要或者说被调用到了)
private:
string nameValue;
T objectValue;
};
参考:
Effective C++ 之条款05