【问题标题】:Use of a trivial constructor使用平凡的构造函数
【发布时间】:2012-01-05 09:44:40
【问题描述】:

12.1/5 如果构造函数是隐式声明的默认构造函数并且满足以下条件,则构造函数是微不足道的:

——它的类没有虚函数 (10.3) 也没有虚基 类 (10.1) 和
— 其类的所有直接基类都有 微不足道的构造函数,以及
— 对于它的所有非静态数据成员 属于类类型(或其数组)的类,每个这样的类都有一个 微不足道的构造函数。

首先我认为一个普通的构造函数只是一个隐式的默认构造函数。但是当阅读上面的标准文本时,似乎琐碎的构造函数不仅是一个隐式默认构造函数,而且它还有上面提到的其他要求。这是什么意思?有一个简单的构造函数有什么意义?

例如:

class X
{
  // ...
};

类 X 是否有一个普通的或隐式的默认构造函数?

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    这取决于// ... 中的内容。

    每个普通构造函数都是隐式声明的默认构造函数,但并非每个隐式声明的默认构造函数都是普通构造函数。如果 it 有一个隐式默认值,则 X 类有一个微不足道的析构函数,并且 它的每个基类都有一个隐式默认值(以及那些基类的基类)类,等等),它的每个成员要么是像int这样的原始类型,要么是具有隐式默认值的类型(以及它的成员的成员,等等,以及它的成员的基类,以及它们的基类,等等,以及它的基类的成员,它们的成员,等等,等等,等等)。

    反过来看可能更容易:如果一个类没有有一个普通的构造函数,那么就没有类扩展它(“is-a”)或包含它( "has-a") 也有一个简单的构造函数。

    【讨论】:

      【解决方案2】:

      平凡的构造函数什么都不做。您帖子中的列表说构造函数在以下情况下是微不足道的:

      1. 您没有通过提供非默认构造函数来使构造函数正常工作
      2. 类的基类没有让构造函数完成与准备处理虚函数、虚基类或它们自己的非平凡构造函数相关的工作
      3. 您的类的数据成员没有使您的构造函数完成与调用它们自己的重要构造函数相关的工作

      这些规则加在一起意味着构造函数无所事事,因此它是微不足道的

      对于X,这一切都取决于它的数据成员:如果它们都有平凡的构造函数,并且如果您自己没有提供非平凡的构造函数,X 也会有平凡的构造函数。

      【讨论】:

      • 你能解释一下构造函数是如何与准备处理虚函数相关联的吗?
      • @user1086635 编译器为具有虚函数的类的布局添加了一个隐藏指针,指向虚函数表(也称为 vtable)。这个指针需要在类准备好使用之前设置。
      • 但是 vtable 是在编译时创建的,当一个对象被创建时,一个隐藏指针被设置为 vtable。在这个过程中,在运行时从不调用构造函数,那么它是如何使用的呢?
      • @user1086635 当然是:在这种情况下,将隐藏指针设置为 vtable 的代码是非平凡的构造函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2018-04-11
      • 2022-01-23
      相关资源
      最近更新 更多