为了账号安全,请及时绑定邮箱和手机立即绑定

编译器为类创建的所有成员函数是什么?这种事经常发生吗?

编译器为类创建的所有成员函数是什么?这种事经常发生吗?

C++
繁花如伊 2019-10-12 19:07:28
编译器为类创建的所有成员函数是什么?这种事经常发生吗?编译器为类创建的所有成员函数是什么?这种事经常发生吗?就像破坏者一样。我关心的是它是否是为所有类创建的,为什么需要默认构造函数?
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

C+98/03

如果需要的话,

  1. 编译器将生成一个

    默认构造函数

    除非您声明了您自己的任何构造函数。
  2. 编译器将生成一个

    复制 构造器

    除非你宣布属于你自己。
  3. 编译器将生成一个

    复制 赋值算子

    除非你宣布属于你自己。
  4. 编译器将生成一个

    破坏者

    除非你宣布属于你自己。

正如Péter在一篇有帮助的评论中所说的,所有这些都是由编译器生成的。当他们需要的时候..(区别在于,当编译器无法创建它们时,只要不使用它们,就可以了。)


C+11

C+11添加以下规则,对于C+14也是如此(托利的信用额,见本评论):

  • 编译器生成

    移动 构造器

    如果
    • 没有用户声明。

      复制 构造器

      ,和
    • 没有用户声明。

      复制 赋值算子

      ,和
    • 没有用户声明。

      移动 赋值算子

    • 没有用户声明。

      破坏者,

    • 它是

      标记为

      删除,

    • 所有的成员和基地

      可动.

  • 类似于

    移动 赋值算子

    如果没有定义用户,则生成
    • 没有用户声明。

      复制 构造器

      ,和
    • 没有用户声明。

      复制 赋值算子

      ,和
    • 没有用户声明。

      移动 构造器

    • 没有用户声明。

      破坏者,

    • 它是

      标记为

      删除,

    • 所有的成员和基地

      可动.

请注意,这些规则比C+03规则更详细,在实践中更有意义。

为了更容易地理解上面提到的项目是什么Thing:

class Thing {public:
    Thing();                        // default constructor
    Thing(const Thing&);            // copy c'tor
    Thing& operator=(const Thing&); // copy-assign
    ~Thing();                       // d'tor
    // C++11:
    Thing(Thing&&);                 // move c'tor
    Thing& operator=(Thing&&);      // move-assign};

作为进一步的阅读,如果您是C+初学者,请考虑不需要您实现最后五个中的任何一个的设计,即a。零规则 (由马蒂尼奥·费尔南德斯).



查看完整回答
反对 回复 2019-10-13
?
RISEBY

TA贡献1856条经验 获得超5个赞

你是指“被创造”的“定义”吗?

$12.1-“默认构造函数(12.1)、复制构造函数和复制赋值操作符(12.8)和析构函数(12.4)是特殊的成员函数。

如果“创建”意味着“定义”,那么下面是C+标准中的重要部分。

-当类用于创建类型(1.8)的对象时,隐式地定义类的默认构造函数。

-如果类没有用户声明的析构函数,则将隐式声明析构函数。隐式声明的析构函数在用于销毁其类型的对象时被隐式定义。

-如果类定义没有明确声明副本构造函数,则将隐式声明副本构造函数。如果隐式声明的副本构造函数用于从类型的对象或从类型派生的类型的副本中初始化类型的对象,则隐式声明的副本构造函数是隐式定义的。

-如果类定义没有明确声明副本赋值操作符,则将隐式声明一个副本赋值操作符。当为类型的对象分配类型的值或从类型派生的类型的值时,隐式声明的副本赋值运算符将被隐式定义。



查看完整回答
反对 回复 2019-10-13
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

默认情况下,如果用户不实现,编译器将向类添加一些成员函数。它们被称为“四大”:

  • 默认构造函数
  • 复制构造函数
  • 复印操作员(作业)
  • 破坏者

根据成员的类型和列出的成员函数您自己提供的,这些将不会全部生成。



查看完整回答
反对 回复 2019-10-13
  • 3 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信