新的默认成员函数
C++11在6个默认成员函数基础上又加了两个:移动构造函数和移动赋值函数
针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:
小结:
(1) 生成默认移动构造的条件比较严苛:必须是没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个,才会生成默认移动构造函数。
(2)没有移动构造函数,编译器会自动调拷贝构造函数:
例如,有一个person类:
不写拷贝构造编译器会自动生成拷贝构造,同样不写构造,拷贝构造,移动构造,编译器才会生成默认移动构造:
假设我们把其他类里的移动构造函数屏蔽调,编译器就调不了,没有移动构造函数,编译器会自动调拷贝构造函数:
假设我们给person类加一个析构函数:我们发现,它就调不了默认移动构造了:
default
假设我们要释放一下内存,调了析构,那么编译器就不会再生成默认移动构造函数。
我们可以利用default强制编译器生成默认移动构造函数:
但是强制生成默认移动构造函数会导致编译器不再生成默认拷贝构造函数:这个时候有两个选择:
1.手动写一个拷贝构造函数:2.default强制编译器再生成一个默认拷贝构造函数:
delete
可以强制性禁止生成默认函数。
例如现在不让生成右值:
可变参数模板
我们之前知道可变参数函数printf:
C++11把可变参数扩展到了模板。格式如下:
可变参数模板可以识别参数类型,个数:
可以通过sizeof()计算参数包的个数: