1、下面錯誤的有: int i; char a[10]; string f(); string g(string &str); A. if(!!i){f();} B. g(f()); C. a=a+1; D. g("abc");
A和C比較容易判斷:A真確,C錯誤。ios
對於B和D,狀況要複雜一些: (MyString爲自定義string)函數
(1) 函數參數爲非MyString引用的狀況 void g(const MyString str) // 或者沒有const { } int main(void) { MyString a; g(a); cout << "end" << endl; return 0;
} 輸出: MyString() // 生成a的時候輸出 copy constructor // 生成str的時候輸出 ~MyString() // g函數執行完畢時,str析構時輸出 end ~MyString() // a析構時輸出
--------------------------------------------------
int main(void)
{
g("abc");
return 0;
}
輸出:
MyString(const char *pData)
~MyString()spa
2、函數參數爲MyString的引用的時候 void g(MyString &str) { } int main(void) { MyString a; g(a); cout << "end" << endl; } 輸出: MyString() end ~MyString()
----------------------------------
int main(void)
{
g("abc");
// 此處出現編譯錯誤。爲了便於解釋,做如下處理
// const MyString temp("abc");
// g(temp);
// 實參是const對象,可是形參倒是很是量引用,因此報錯
// 若是函數g改成 void g(const MyString &str),則g("abc")是正確的
return 0;
}
3、函數的返回值爲基本數據類型和類對象的時候 #include<iostream> using namespace std; class A {}; A getA() { A a; return a; } int getInt() { return 6; } int main(void) { A x; getA() = x; //ok,臨時的對象可尋址 getInt() = 6; //error,臨時的基本數據類型不可尋址 return 0; }
4、函數g和f結合起來 MyString f() { MyString a("hello"); return a; } void g(MyString &str) { } int main(void) { g(f()); // 能夠理解爲 函數f返回時經過拷貝構造函數生成了MyString類的一個對象temp, // g(temp); 若是函數f變爲 const MyString f(),則g(f())明顯是錯誤的。 retrun 0; } 輸出: MyString(const char *pData) copy constructor ~MyString() ~MyString()