公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

XMC实验分享之126: C++11关键字default, delete

XMC实验分享之126: C++11关键字default, delete

User12775
Level 5
Level 5
First solution authored First like received

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&);
};

这个设计虽然可以达到不能被复制的目的, 但是也有很多副作用, 不是最好的设计.

0 点赞
986 次查看
3 评论