- =default
使用 = default生成默认构造函数:
class Sales_data
{
public:
//拷贝控制成员 使用default
Sales_data() = default;
Sales_data(const Sales_data&) = default;
Sales_data& operator=(const Sales_data&);
~Sales_data() = default;
};
Sales_data& Sales_data::operator=(const Sales_data&) = default;
因为该构造函数不接受任何实参,所以它是一个默认构造函数,定义这个构造函数的目的仅仅是因为我们既需要其他形式额构造函数,也需要默认的构造函数,我们希望这个函数作用完全等同于之前使用的合成默认构造函数在C++11中,如果我们需要默认的行为,那么可以通过在参数列表后面写上 = default来要求编译器生成构造函数,其中 = default在类的内部,则默认构造函数是内联的,如果它在类的外部,则该成员默认情况下不是内联的,上面的默认构造函数之所以对Sales_data有效,是因为我们为内置类型的数据成员提供了初始值,如果你的编译器不支持类内初始值,那么你的默认构造函数就应该使用构造函数初始值列表来初始化类的每个成员
类数据成员的初始值:
如果我们希望Window_mgr类开始时总是拥有一个默认初始化的screens,C++11中最好的方式就是把这个默认值声明成一个类内初始值
class Window_mgr
{
private:
std::vector<int> screens{ 1,2,3,4,5 };
};
类内初始值必须使用 = 的初始化形式或者花括号括起来的直接初始化形式
- 委托构造函数
C++11扩展了构造函数初始值的功能,使得我们可以定义所谓的委托构造函数,一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些(或者全部)职责委托给了其他构造函数,和其他构造函数一样,一个委托构造函数也有一个成员初始值的列表和一个函数体,参数列表必须与类中另外一个构造函数匹配
class Sales_data
{
public:
//非委托构造函数使用对应实参初始化成员
Sales_data(std::string s, unsigned cnt, double price) :bookNo(s), units_sold(cnt), revenue(cnt*price) {}
//其余构造函数全部都委托给另一个构造函数
Sales_data() :Sales_data("", 0, 0) {}
Sales_data(std::string s) :Sales_data(s, 0, 0) {}
Sales_data(std::istream &is) :Sales_data() { read(is, *this); }
//....
};
当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行,在此类中,受委托的构造函数体恰好是空的,假如函数体包含有代码的话,将先执行这些代码,然后控制权才会交给委托者的函数体
- =delete
= delete 定义删除的函数 阻止拷贝、赋值等,新标准下,我们可以通过将拷贝构造函数和赋值运算符重载函数定义为删除的函数来阻止拷贝,删除函数是这样一种函数:虽然声明了它们,但不能以任何方式使用它们
struct NoCopy
{
NoCopy() = default; //使用合成的默认构造函数
NoCopy(const NoCopy&) = delete; //阻止拷贝
NoCopy& operator=(const NoCopy&) = delete; //阻止赋值
~NoCopy() = default; //使用合成的析构函数
//其他成员
};
= delete通知编译器,我们不希望定义这些成员,与 = default不同, = delete必须出现在函数第一次声明的时候,这个差异与这些声明的含义在逻辑上是吻合的,一个默认的成员只影响为这个成员生成的代码,因此 = default直到编译器生成代码时才需要,另一方面,编译器需要知道一个函数是删除的,以便禁止试图使用它的操作,与 = default的另一个不同之处是,我们可以对任何函数指定 = delete(我们只能对编译器可以合成的默认构造函数或拷贝控制成员使用 = default)。虽然删除函数的主要用途是禁用拷贝控制成员,但我们希望引导函数匹配过程时,删除函数有时也是有用的
析构函数不能是删除的成员:如果析构函数被删除,就无法销毁此类型的对象了
private拷贝控制:在新标准发布之前,类是通过将其拷贝构造函数和运算符重载函数声明为private的来阻止拷贝