繁体   English   中英

定义的副本构造函数c ++的默认行为

[英]default behaviour of defined copy constructor c++

假设我为类B定义了一个复制c'tor,它继承了A并且还具有成员变量。 在copt c'tor主体内部,我编写了一些代码,但是在初始化列表中,我没有显式调用A c'tor(也不是复制c'tor),也没有初始化成员变量。

在这种情况下,默认的c'tor将在到达B'复制c'tor主体之前被默认调用。 但是成员变量会是什么呢? 他们会使用其默认c'tor或带有争论对象成员的副本c'tor(参数对象==给予B复制c'tor)进行初始化。

另外,如果在初始化列表中调用了某些成员的副本c'tor / c'tor或父类副本c'tor / c'tor,该行为是否会改变?

我知道,万一我们没有明确定义复制c'tor的话,就会调用父类和复制c'tor的成员。

我在这里应该期待什么?

在这种情况下,将默认初始化基类的子对象。 参见[class.base.init] / 8:

在非委托的构造函数中,如果给定的可能构造的子对象未由mem-initializer-id指定(包括由于构造函数没有ctor-initializer而没有mem-initializer-list的情况),则

  • 如果实体是具有大括号或相等初始化程序 [..]的非静态数据成员,则
  • 否则,如果实体是匿名联合或变量成员(9.5),则不执行初始化;
  • 否则,该实体为默认初始化(8.5)。

在[special] / 5中定义了一个可能构造的子对象:

对于一个类,其非静态数据成员, 其非虚拟直接基类 ,以及如果该类不是抽象(10.4),则其虚拟基类称为其潜在构造的子对象。

如果您编写一个复制构造函数并且不初始化成员变量,那么它将被默认初始化。

这同样适用于基类,在大多数情况下,它们与成员变量相同。

这是一些示例代码,将演示:

#include <iostream>

using namespace std;

struct S
{
    S() { cout << "S()\n"; }
    S(S const &) { cout << "S(S&)\n"; }
};

struct T : S
{
    T() {}
    T(T const &t) {}

    // you have to explicitly write this if you want it 
    // T(T const &t): S(t) {}
    //                ^^^^
};

int main()
{
    T t;
    T u(t);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM