2012-07-16 54 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

相關問題