条款05 了解C++默默编写并调用哪些函数。
1、我们编写的每个类几乎都有一个或多个构造函数、一个析构函数和一个赋值运算符。 他们操控类对象基本的生死行为。
2、如果自己没有声明,编译器就会为类声明一个default 构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数。 所有这些函数都是 public 而且 inline(第30条)。
PS:空类(empty class):https://www.jianshu.com/p/ff9eb9c381c1
class EmptyClass
{
public:
EmptyClass();//default构造
~EmptyClass();//析构
EmptyClass(const EmptyClass&);//拷贝构造
EmptyClass& operator=(const EmptyClass& res);//copy assignment操作符
};
3、唯有这些函数被调用,它们才会被编译器创建出来。
Empty e1; // default构造函数
Empty e2(e1); // copy构造函数
e2 = e1; // copy assignment操作符
4、当类成员为reference或者是const时,编译器拒绝为class生成一个operator=(copy assignment)。
这是因为:①、c++并不允许让reference改指向不同的对象②、const声明的变量也不允许被修改。
class MyTest
{
public:
MyTest(int nNum,string& str)
:m_nNum(nNum),
m_string(str)
{
}
private:
const int m_nNum;
string& m_string;
};
int main()
{
int x(111);
string s = "123ABC";
MyTest t(x, s);
int xx(111);
string ss = "123ABC";
MyTest tt(xx, ss);
tt = t;//error
cin.get();
return 0;
}
此时编译器为之构造的函数就不能解决问题,这种情况下就需要自己来定义copy assignment操作符的函数。
5、总结。
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment函数,以及析构函数。