class A
{
std::string name;
public:
A(const A & rhs)
{
name = rhs.name;
}
};
在上面類A的拷貝構造函數中,將調用字符串類的賦值運算符還是拷貝字符串類的構造函數?複製構造函數中的C++用戶自定義成員
名稱數據成員尚未定義,所以不會調用複製構造函數?
class A
{
std::string name;
public:
A(const A & rhs)
{
name = rhs.name;
}
};
在上面類A的拷貝構造函數中,將調用字符串類的賦值運算符還是拷貝字符串類的構造函數?複製構造函數中的C++用戶自定義成員
名稱數據成員尚未定義,所以不會調用複製構造函數?
賦值運算符。如果你想拷貝構造函數:
A(const A& rhs)
: name(rhs.name)
{
}
名稱數據成員尚未定義,所以不會調用複製構造函數? – Medicine 2012-07-16 00:10:30
@Medicine:no。在你輸入構造函數的主體之前,'name'必須以某種方式構造,以便你有一個完整的對象來處理。 (如果在這個答案中沒有指定構造函數,C++將選擇默認的構造函數。)從這一點開始,不能只是構建'name' _again_,你必須指定它。 – leftaroundabout 2012-07-16 00:25:39
在這種情況下,分配A對象的內存,然後如果調用A上的複製構造函數,則需要初始化名稱成員。 name的內存被分配,但之前未被初始化,因此它將在構造函數中首次定義,因此需要調用string類的複製構造函數。是不是類似於A a1; A a2 = a1;其中a2是從a1構建的副本,因爲a2是第一次定義的。 – Medicine 2012-07-16 00:29:15
默認(編譯器生成)賦值運算符將被調用,做了成員的成員分配
名稱數據成員尚未定義,所以不會調用複製構造函數? – Medicine 2012-07-16 00:10:35
@醫學編號對於'姓名'的註冊人在A的主體進入時已經被呼叫。如果你想使用ctor(複製或其他),你必須在身體之外指定它,就像在Joe的回答中一樣。由於'name'已經構建,您的示例將調用賦值運算符。 – 2012-07-16 01:38:23
這兩個,我想。首先調用複製構造函數來創建賦值運算符分配的'rhs.name'副本。 – Linuxios 2012-07-16 00:09:07