C++11之“=default” 和“=delete”

1、拷贝控制操作

       拷贝控制操作有拷贝构造函数拷贝赋值函数移动构造函数移动赋值运算符析构函数

       如果一个类没有定义所有这些拷贝控制成员,编译器会自动为它定义(合成)缺失的操作,如定义一个合成拷贝构造函数、合成拷贝赋值函数等。因此,很多类会忽略这些拷贝控制操作。但是,对一些类来说,依赖这些操作的默认定义会导致灾难。

 

2、使用=default

       如果我们不想使用编译器默认生成的拷贝控制操作,我们可以通过将拷贝控制成员定义为=default来显示地要求编译器生成合成的版本。

例:

class MyData{
public:
	MyData() = default;                   // 构造函数
	MyData(const MyData&) = default;      // 拷贝构造函数
	MyData& operator=(const MyData &);    // 拷贝赋值运算
	~ MyData() = default;                 // 析构函数
};
MyData& MyData::operator = (const MyData &) = default;

        当我们在类内用=default修饰成员的声明时,合成的函数将隐式地声明为内联的(就像任何其他类内声明的成员函数一样)。如果我们不希望 合成的成员是内联函数,应该只对成员的类外定义使用=default,就像对拷贝赋值运算符所做的那样。

        注:我们只能对具有合成版本的成员函数使用=default (即,默认构造函数或拷贝控制成员)。对于大多数类应该定义默认构造函数、拷贝构造函数和拷贝赋值运算符,无论是隐式地还是显式地。

 

3、使用=delete

       虽然大多数类应该定义(而且通常也的确定义了)拷贝构造函数和拷贝赋值运算符,但对某些类来说,这些操作没有合理的意义。在此情况下,定义类时必须采用某种机制阻止拷贝或赋值。例如,iostream 类阻止了拷贝,以避免多个对象写入或读取相同的I0缓冲。为了阻止拷贝,看起来可能应该不定义拷贝控制成员。但是,这种策略是无效的:如果我们的类未定义这些操作,编译器为它生成合成的版本。

       在新标准下,我们可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数来阻止拷贝。删除的函数是这样一种函数: 我们虽然声明了它们,但不能以任何方式使用它们。在函数的参数列表后面加上=delete来指出我们希望将它定义为删除的:

例:

struct NoCopy{
	NoCopy() = default;                        // 使用合成的默认构造函数
	NoCopy(const NoCopy&) = delete;            // 阻止拷贝
	NoCopy &operator=(const NoCopy&) = delete; // 阻止赋值
	~ NoCopy() = default;                      // 使用合成的析构函数
};

=delete通知编译器,我们不希望定义这些成员。

        注:析构函数不能是删除的成员,值得注意的是,我们不能删除析构函数。如果析构函数被删除,就无法销毁此类型的对象了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的变量或创建该类的临时对象。而且,如果一个类有某个成员的类型删除了析构函数,我们也不能定义该类的变量或临时对象。因为如果一个成员的析构函数是删除的,则该成员无法被销毁。而如果一个成员无法被销毁,则对象整体也就无法被销毁了。

       本质上,这些规则的含义是:如果一个类有数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的。

 

4、”=default”和”=delete”的区别

       与=default不同,=delete 必须出现在函数第一次声明的时候,这个差异与这些声明的含义在逻辑上是吻合的。一个默认的成员只影响为这个成员而生成的代码,因此=default直到编译器生成代码时才需要。而另一方面,编译器需要知道一个函数是删除的,以便禁止试图使用它的操作。

        与=default的另一个不同之处是,我们可以对任何函数指定=delete (我们只能对编译器可以合成的默认构造函数或拷贝控制成员使用=default)。虽然删除函数的主要:用途是禁止拷贝控制成员,但当我们希望引导函数匹配过程时,删除函数有时也是有用的。

原创文章 99 获赞 68 访问量 3万+

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/104431599