1
我上在C++中,當一個函數返回值的對象,在呼叫點應複製構造函數被調用
(Ubuntu的5.4.0-6ubuntu1〜16.04.4執行以下代碼C++代碼)5.4.0 20160609
class x {
public :
int data ;
x(int v) {cout<<"1 args constr\n" ; data = v ;}
x(const x& o) {cout<<"copy constr\n" ;}
x &operator=(const x&o) {cout<<"assignment opr\n" ;}
~x() {cout<<"destr\n" ;}
} ;
x fun() {
cout<<"in func\n" ; //#1
x o(-19) ; //#2
cout<<"returning...\n";
return o ; //#3
}
main() {
x ob = fun() ; //#4
cout<<ob.data<<endl ;
}
並獲得以下輸出: 在FUNC 1個ARGS構造 返回... -19 destr
我所無法理解的是:
- 爲什麼構造函數和析構函數稱爲ONY一次
- 當我按值返回,爲什麼不調用拷貝構造函數
根據我的理解,ob
在main
的範圍內創建。因此ob
的構造函數和析構函數應在main
的範圍內調用。 同樣,在fun
範圍內創建了o
。因此,在fun
X&運算符=(常量X&O){COUT << 「分配OPR \ n」;} 錯誤這裏固定 –
閱讀有關(HTTP的[五規則]所述運算符重載定義:// en.cppreference.com/w/cpp/language/rule_of_three) –
@ Basile Starynkevitch我沒有編譯C++ 11的代碼。即使在爲C++ 11添加移動語義和編譯之後,我也獲得了相同的輸出 – user3282758