#
- 對象在生命週期結束時系統自動調用對應的析構函數,則析構函數調用次數等於構造和拷貝構造函數調用次數之和。
- 對象作返回值返回時調用拷貝構造函數,如果拷貝構造作返回接拷貝構造傳參或接拷貝構造構造對象時,將被優化。
- 上一句總結爲:不間斷的拷貝構造將被優化。
完成下面的題目。
Test1中調用了次AA的拷貝構造函數,次AA的賦值運算符函數的重載。
Test2中調用了次AA的拷貝構造函數,次AA的賦值運算符函數的重載。
Test3中調用了次AA的拷貝構造函數,次AA的賦值運算符函數的重載。
class AA
{};
AA f (AA a)
{
return a ;
}
void Test1 ()
{
AA a1 ;
a1 = f(a1);
}
void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}
void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}
分析與驗證
寫個 AA 類和 f 函數
- 構造、拷貝構造和析構函數中輸出相應字符,觀察調用情況。
- 在調用 f 函數中輸出字符,觀察成員函數調用與 f 函數調用順序。
class AA
{
public:
AA()
{
cout << "構造" << endl;
}
AA(AA& a)
{
cout << "拷貝構造" << endl;
}
~AA()
{
cout << "析構" << endl;
}
AA& operator=(AA& a)
{
cout << "=重載" << endl;
return a;
}
};
AA f(AA a)
{
cout << "f" << endl;
return a;
}
Test1()
void Test1 ()
{
AA a1 ;
a1 = f(a1);
}
- 過程分析
構造,拷貝構造傳參,拷貝構造返回,賦值運算符重載,無優化。 結果(截圖太麻煩,我把輸出結果考過來,下同)
構造
拷貝構造
f
拷貝構造
析構
=重載
析構
析構Test2()
“`
void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}
- 過程分析
構造,拷貝構造傳參,拷貝構造返回——構造對象,一次優化
- *輸出結果*
構造
拷貝構造
f
拷貝構造
析構
析構
析構
###Test3()
void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}
“`
- 過程分析
構造,拷貝構造傳參,拷貝構造返回——拷貝構造傳參,拷貝構造返回——拷貝構造構造,兩次優化。
- 輸出結果
構造
拷貝構造
f
拷貝構造
析構
f
拷貝構造
析構
析構
析構