首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义复制构造函数c++的默认行为

定义复制构造函数c++的默认行为
EN

Stack Overflow用户
提问于 2015-02-05 11:59:06
回答 2查看 101关注 0票数 2

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

在这种情况下,默认的c‘’tor将在到达B‘复制c’‘tor主体之前被默认调用。但是成员变量会是什么呢?它们是用它们默认的c‘to初始化还是用它们的副本c’to来初始化,还是用论争对象的成员(参数对象==给B副本c‘to)初始化。

此外,如果在初始化列表中调用某些成员的副本c‘to /c’to或父类复制c‘to/c’to这种行为会被改变吗?

我知道,如果我们没有明确定义复制c‘’tor:父类和成员复制c‘’tor的调用。

我在这里应该期待什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-05 12:04:31

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

在非委托构造函数中,如果给定的可能构造的子对象没有由mem初始化程序id指定(包括由于构造函数没有ctor初始化器而没有mem初始化程序列表的情况),那么,

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

并在特殊/5中定义了潜在构造的子对象:

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

票数 2
EN

Stack Overflow用户

发布于 2015-02-05 12:02:31

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

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

下面是一些示例代码,将演示:

代码语言:javascript
复制
#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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28343407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档