C++学习笔记5
1. 拷贝构造函数
class Com{
public:
Com(); //默认构造函数
Com(const Com& ); //拷贝构造函数
};
拷贝构造函数的参数必须是引用类型。为什么如此呢?加入不是引用类型,当我们拷贝初始化的时候,需要将实参拷贝到形参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此循环。
string dots(10, '.'); //直接初始化
string s(dots); //直接初始化
string s2 = dots; //拷贝初始化
string null_book = "9-999-9999-9" //拷贝初始化
string nines = string(100, '9'); //拷贝初始化
当使用直接初始化时,我们实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中。拷贝初始化通常使用拷贝构造函数,但如果存在移动构造函数的化,也会使用移动构造函数。
2. 拷贝赋值运算符
class Com{
public:
Com();
Com& operator=(const Com&);
};
通常,赋值运算符会返回一个指向其左侧运算对象的引用。
3. 三/五原则
如果一个类需要析构函数,那几乎肯定也需要拷贝构造函数和拷贝赋值运算符。
如果一个类需要拷贝构造函数,则几乎肯定需要拷贝赋值运算符,反之亦然。但这都不以为这一定需要析构函数。
4. noncopyable
构造函数在protected下,我们既可以防止该类被构建,又可以使得该类能够作为基类,被继承。
class noncopyable{
protected:
noncopyable() = default; //使用合成的默认构造函数
public:
noncopyable(const noncopyable&) = delete; //阻止拷贝
noncopyable& operato