2016-12-12 20 views
1

我對以下代碼感到困惑,我想不通爲什麼Test t作爲參數在calcreturn t將調用Test(Test &t)?任何人都可以幫我明確嗎?非常感謝!如何在C++中傳遞自引用作爲參數?

#include <iostream> 
using namespace std; 

class Test { 
    public: 
    Test(int na, int nb) { 
     a = na; 
     b = nb; 
    } 

    Test(Test &t) { 
     a = t.a + 1; 
     b = t.b + 1; 
    } 

    int getValue() { 
     return a + b; 
    } 

    Test calc(Test t) { 
     return t; 
    } 
    private: 
    int a; 
    int b; 
}; 

int main() { 
    Test t(1, 1); 
    cout << t.calc(t).getValue() << endl; 
} 

回答

5

在行

cout << t.calc(t).getValue() << endl; 
     ^^^^^^^^^ 
      here 

按值傳遞t,而不是引用(在聲明Test Test::calc(Test t)再看看),這樣的說法t被複制。副本意味着

Test(Test &t) 

return t;同樣的想法拷貝構造函數的調用 - 返回(本地)對象從函數的返回地點目的地的本地堆棧複製。

順便說一句,你可能要一個const的拷貝構造函數,

Test(const Test &t) 

因爲一般你不會想修改源。雖然在技術上你可以有一個副本ctor,其參數爲非常量,請參閱Can a copy-constructor take a non-const parameter?

+0

感謝您的快速回復,我可以弄清楚你說'calc(t)';然而,爲什麼'返回t'也觸發拷貝構造函數?我認爲它應該和'calc'的'Test t'一樣的地址? – CYB

+1

@CYB我剛剛解釋它,看看編輯。 – vsoftco

+0

哦!該函數需要返回一個'Test'對象,所以它再次被複制!它是否正確 ?順便說一句,非常感謝你! – CYB