复制构造函数中的c ++用户定义成员

Posted

技术标签:

【中文标题】复制构造函数中的c ++用户定义成员【英文标题】:c++ user defined member in copy constructor 【发布时间】:2012-07-16 00:06:02 【问题描述】:
class A

std::string name;
public:
A(const A & rhs)

name = rhs.name;

;

上面A类的拷贝构造函数中,是调用字符串类的赋值运算符还是字符串类的拷贝构造函数?

name数据成员还没有定义,所以不会调用拷贝构造函数吗?

【问题讨论】:

两者,我想。首先调用复制构造函数来制作rhs.name 的副本,该副本是使用赋值运算符进行赋值的。 【参考方案1】:

赋值运算符。如果你想要复制构造函数:

A(const A& rhs)
: name(rhs.name)


【讨论】:

name 数据成员还没有定义,所以不会调用复制构造函数吗? @Medicine:没有。在你进入构造函数的主体之前,name 必须以某种方式构造,这样你就有了一个完整的对象可以使用。 (如果此答案中未指定构造函数,C++ 将选择默认构造函数。)从那时起,您不能只构造 name再次,您必须分配给它。跨度> 在这种情况下,为A对象分配内存,然后如果调用A上的复制构造函数,则需要初始化name成员。 name的内存是分配的,但之前没有初始化,所以会在构造函数中第一次定义,所以需要调用string类的拷贝构造函数。不是类似于 A a1; A a2 = a1;其中 a2 是从 a1 构造的副本,因为 a2 是第一次定义的。【参考方案2】:

将调用一个默认的(编译器生成的)赋值运算符,执行逐个成员的赋值

【讨论】:

name 数据成员还没有定义,所以不会调用复制构造函数吗? @Medicine No. name 的 ctor 在输入 A 的 ctor 主体时已经被调用。如果你想使用一个ctor(副本或其他),你必须在身体之外指定它,就像乔的回答一样。由于 name 已经构建,您的示例将调用赋值运算符。

以上是关于复制构造函数中的c ++用户定义成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中类的默认成员函数的问题(构造函数、析构函数、运算符 =、复制构造函数)(默认 ctor、dtor、复制 ctor)

如果类成员是向量,我们是不是应该显式编写复制构造函数?

我定义了一个非拷贝构造函数;复制构造函数是不是仍会被隐式定义?

C++ 构造函数 & 析构函数

C++知识分享:C++类特殊成员函数

C ++用户定义的空默认构造函数与隐式或默认的默认构造函数