复制构造函数中的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)