P9:
=default =delete
构造函数、拷贝构造、拷贝赋值、以及新的搬移构造、新的搬移赋值
=default表示要编译器给我们的那一个,即使我们已经定义了,也要编译器给我们的那一个
=delete表示我们不要它
对于编译器提供的默认构造函数default ctor,实际上就是一个空的函数,什么也没做
对于继承,编译器会调用父类的默认构造函数
但是如果你写了构造函数,并且你还想要编译器给你一个空的构造函数,就用=default
我们写了构造函数-------->Zoo(int i1,int i2) : d1(i1), d2(i2) { }
拷贝构造函数Zoo(const Zoo&)
右值引用Zoo(Zoo&&)
拷贝赋值
搬移赋值
析构函数
对于这个块引用中提到的函数,如果我们没有定义它们,那么编译器会为我们提供默认的版本
好奇标准库有没有用到这个语法
析构函数---------->~duration = default
如果析构函数写成 =delete,那么麻烦就大了
什么情况可以加=default,什么情况可以加=delete,并且加了不加编译过不过
构造函数本来就可以有很多,所有第一个、第二个可以并存
拷贝构造函数只能有一份,如果我们写了拷贝构造函数,那么 =default和=delete都会报错
拷贝赋值函数只能有一份,如果我们写了拷贝赋值函数,那么 =default和=delete都会报错
析构函数,可以=default
一般的成员函数不可以 =default
一般的成员函数可以 =delete,但是如果不想要这个成员函数,可以不写
写一个空的class Empty{ }
但是对于左面的程序(构造函数、拷贝构造、拷贝赋值、析构函数),编译器为我们提供了默认的程序(编译器为我们提供的默认的构造函数、默认的拷贝构造、默认的拷贝赋值、默认的析构函数都是public且inline)
这些函式做了什么呢?default ctor和dtor主要是给编译器一个地方用来放置藏身幕后(子类的构造函数调用父类的构造函数,这个调用父类构造函数的动作就要写在幕后的code中,)的code,像是唤起base classes以及non-static members的ctor和dtors。
到底什么class需要定义big three?什么class需要默认的版本就够了?
一个类里面只要带有pointer指针成员,就需要在class里面定义big three
一个类里面没有带有pointer指针成员,不需要在class里面定义big three,使用默认的就足够了
复数里面只有实部、虚部,没有指针
类模板中定义了构造函数,没有默认的构造函数,并且构造函数里面有初值----------->_Tp()有默认值,这个默认值取决于传入的参数类型,例如传入的类型式int,那么_Tp()默认值是0
字符串string里面有指针
指针的浅拷贝------>指针占4个字节,只是将这4个字节拷贝过去
指针的深拷贝------>指针占4个字节,不仅将这4个字节拷贝过去,还要将指针所指的内容也拷贝过去
因为字符串string 的代码比较复杂,侯捷老师没有展示
No-copy---------------->与拷贝有关的(拷贝构造,拷贝赋值)delete,通通不准外界调用
NoCopy(const NoCopy&) = delete //不允许拷贝构造 NoCopy &operator =(const NoCopy&) = delete //不允许拷贝赋值
NoDtor-------------->将析构函数都delete掉
~NoDtor() = ddelete //不允许析构,但是这种情况后果自负
PrivateCopy------------>将拷贝有关的(拷贝构造、拷贝赋值)private,
谁可以访问一个class的私有部分呢?-------------->(友元和class里面的members)friends和members
boost是C++里面的一个社群,研究比较前沿的东西,完成后会放在C++的标准库里面
Foo继承noncopyable,那么Foo就拥有noncopyable的性质