类的函数声明后的“默认”是什么意思?

我已经看到default在类中的函数声明旁边使用过。它有什么作用?


class C {

  C(const C&) = default;

  C(C&&) = default;

  C& operator=(const C&) & = default;

  C& operator=(C&&) & = default;

  virtual ~C() { }

};


蝴蝶刀刀
浏览 572回答 3
3回答

不负相思意

这是C ++ 11的新功能。这意味着您要使用编译器生成的该函数的版本,因此您无需指定主体。您还可以= delete用于指定您不希望编译器自动生成该函数。随着移动构造函数和移动赋值运算符的引入,生成自动版本的构造函数,析构函数和赋值运算符的规则变得相当复杂。使用= default和= delete使事情变得容易,因为您无需记住规则:您只需说出要发生的事情即可。

侃侃无极

这是C ++ 0x的一项新功能,可告诉编译器创建相应构造函数或赋值运算符的默认版本,即仅对每个成员执行复制或移动动作的版本。这很有用,因为默认情况下并非总是生成move构造函数(例如,如果您有自定义析构函数),这与copy构造函数(以及类似的赋值方法)不同,但是如果没有什么不平凡的编写,最好让编译器会处理它,而不是每次都自己拼出来。还要注意,如果提供任何其他非默认构造函数,则不会生成默认构造函数。如果仍然需要默认的构造函数,则可以使用此语法来使编译器合而为一。作为另一个用例,在某些情况下不会隐式生成副本构造函数(例如,如果您提供自定义的移动构造函数)。如果仍然需要默认版本,则可以使用此语法进行请求。有关详细信息,请参见标准的12.8节。

尚方宝剑之说

它是C ++ 11中的新功能,请参见此处。如果您定义了一个构造函数,但想对其他构造函数使用默认值,则它会非常有用。在C ++ 11之前的版本中,您必须定义所有构造函数,即使它们等同于默认构造函数。还要注意,在某些情况下,不可能提供用户定义的默认构造函数,该构造函数在默认和值初始化下的行为与编译器综合的行为相同。default使您能够恢复该行为。
打开App,查看更多内容
随时随地看视频慕课网APP