- Forums
- Resources
- About
- Groups
Close
C语言的关键字default大家都很熟, 用作switch语句中的默认分支. 这个功能C语言的功能. 今天分享的关键字default是C++11增加的关键字, 和配套的delete. 这个delete当然也不是那个new/delete的那个.
C++11中, default和delete两个关键字可以用于显示声明需要自动生成或者删除默认某些函数.
在C++11之前的C++语言中,如果程序员不写构造函数, 析构函数, 复制赋值函数, 编译器会自动生成默认的版本. 这三者被称为特殊成员函数。C++11增加了move语义, 所以特殊函数也增加了move构造函数和move赋值函数。
对于简单的类, 自动生成的函数很好用。但是对于复杂的类型, 程序员经常会自己写一个某种版本的特殊函数. 这种情况编译器会停止自动生成默认的特殊函数. 实际工程实践中:
如果用户提供了一个构造函数, 默认的构造函数不会被生成
如果用户提供了一个虚的析构函数, 默认的析构函数不会被生成
如果用户提供了move构造函数和move赋值函数, 默认的move构造函数和move赋值函数不会被生成
如果用户提供了 复制构造函数, 或复制赋值函数,或析构函数, 或move构造函数, 或move赋值函数, 默认的move构造函数和move赋值函数不会被生成
C++11还增加了一些其他规则, 这些规则导致默认生成的逻辑很难搞清楚.
比如要设计一个不允许被复制的结构, C++11的default和delete关键字之前一般这么设计:
struct noncopyable { noncopyable() {}; private: noncopyable(const noncopyable&); noncopyable& operator=(const noncopyable&); };
这个设计虽然可以达到不能被复制的目的, 但是也有很多副作用, 不是最好的设计.
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。