2012-07-16 93 views
0
class A 
{ 
std::string name; 
public: 
A(const A & rhs) 
{ 
name = rhs.name; 
} 
}; 

在上面类A的拷贝构造函数中,将调用字符串类的赋值运算符还是拷贝字符串类的构造函数?复制构造函数中的C++用户自定义成员

名称数据成员尚未定义,所以不会调用复制构造函数?

+0

这两个,我想。首先调用复制构造函数来创建赋值运算符分配的'rhs.name'副本。 – Linuxios 2012-07-16 00:09:07

回答

4

赋值运算符。如果你想拷贝构造函数:

A(const A& rhs) 
: name(rhs.name) 
{ 
} 
+0

名称数据成员尚未定义,所以不会调用复制构造函数? – Medicine 2012-07-16 00:10:30

+1

@Medicine:no。在你输入构造函数的主体之前,'name'必须以某种方式构造,以便你有一个完整的对象来处理。 (如果在这个答案中没有指定构造函数,C++将选择默认的构造函数。)从这一点开始,不能只是构建'name' _again_,你必须指定它。 – leftaroundabout 2012-07-16 00:25:39

+0

在这种情况下,分配A对象的内存,然后如果调用A上的复制构造函数,则需要初始化名称成员。 name的内存被分配,但之前未被初始化,因此它将在构造函数中首次定义,因此需要调用string类的复制构造函数。是不是类似于A a1; A a2 = a1;其中a2是从a1构建的副本,因为a2是第一次定义的。 – Medicine 2012-07-16 00:29:15

0

默认(编译器生成)赋值运算符将被调用,做了成员的成员分配

+0

名称数据成员尚未定义,所以不会调用复制构造函数? – Medicine 2012-07-16 00:10:35

+1

@医学编号对于'姓名'的注册人在A的主体进入时已经被呼叫。如果你想使用ctor(复制或其他),你必须在身体之外指定它,就像在Joe的回答中一样。由于'name'已经构建,您的示例将调用赋值运算符。 – 2012-07-16 01:38:23

相关问题