拷貝構造的優化問題

#

  • 對象在生命週期結束時系統自動調用對應的析構函數,則析構函數調用次數等於構造和拷貝構造函數調用次數之和。
  • 對象作返回值返回時調用拷貝構造函數,如果拷貝構造作返回接拷貝構造傳參或接拷貝構造構造對象時,將被優化。
  • 上一句總結爲:不間斷的拷貝構造將被優化。

完成下面的題目。

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
拷貝構造
析構
析構
析構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章