Iam試圖理解複製構造函數,請理解我是如何工作的。複製構造函數由用戶定義時的構造函數的行爲
案例1
class fruit{
public: int i;
fruit(int j){
i = j;
}
};
int main(){
fruit f1 = fruit(2); // works fine when no user defined copy constructor
return 0;
}
案例2
class fruit{
public: int i;
fruit(fruit &f){
i = f.i + 1;
}
fruit(int j){
i = j;
}
};
int main(){
fruit f1 = fruit(2); // error no matching call fruit::fruit(fruit) why?
return 0;
}
案例3
class fruit{
public: int i;
fruit(){
i = 0;
}
};
int main(){
fruit f2;
fruit f1 = fruit(f2); // works fine when no user defined copy constructor
return 0;
}
案例4
class fruit{
public: int i;
fruit(){
i = 0;
}
fruit(fruit &f){
i = f.i + 1;
}
};
int main(){
fruit f2;
fruit f1 = fruit(f2); // error no matching call fruit::fruit(fruit)
return 0;
}
Technically 'fruit(f2)' must be valid because
f2 can be passed by reference to fruit(fruit &f). right? but why error?
爲什麼我在Case 2
和Case 4
得到錯誤?這是因爲我創建了用戶定義的拷貝構造函數嗎?如果原因是用戶定義的拷貝構造函數,則編譯器甚至會提供默認的拷貝構造函數。像內部fruit(fruit &)
所以即使複製構造函數可用編譯器提供的程序。爲什麼它不會引起錯誤Case 1
和Case 3
我知道當用戶定義複製構造函數時,所有的構造函數都被阻止了=
。 =
只能調用複製構造函數。但是一個類必須有一個拷貝構造函數可以由用戶或編譯器來完成。如果它是由編譯器提供的,那麼它也必須引發錯誤。但它不這樣做?
'水果(水果)'是不是一個拷貝構造函數,只是一個普通的構造函數,需要一個左值'fruit'參考。 'fruit(fruit const&)'是一個拷貝構造函數,'fruit(fruit &&)'是一個移動構造函數,在你的例子中會被調用(如果提供的話)。這是因爲你構造的臨時值不是l值,所以不能綁定到l值引用('&'),但可以綁定到r值引用('&&')。 – Cameron 2014-11-06 18:31:34
@Cameron:是的,這是一個複製構造函數。不如通常使用const引用,而是使用相同的拷貝構造函數。 – 2014-11-06 18:39:04
@Cameron:不幸的是,它是一個拷貝構造函數。我不認爲它應該是,但是[C++ 11:12.8/2]不同意。 – 2014-11-06 18:41:36