2014-08-29 154 views
2

從函數調用我在做一些C++測試,我不明白下面的代碼:C++構造參考

class A 
{ 
public: 
A(int n = 0): m_n(n) 
{ 
    std::cout << 'd'; 
} 

A(const A& a): m_n(a.m_n) 
{ 
    std::cout << 'c'; 
} 

private: 
    int m_n; 
}; 

void f(const A &a1) 
{ 
} 

int main() 
{ 
    //Call 'f' function and prints: d 
    f(3); 
    return 0; 
} 

我不明白的是爲什麼構造這裏稱爲並打印「d 「?

謝謝。

回答

8

您正將一個int值傳遞給想要引用A值的函數。爲了提供該參數,使用轉換構造函數A(int)創建臨時A,打印'd'

在函數返回後,臨時表達式在語句結束時被銷燬。

請注意,這隻適用於如果參考是const右值參考。臨時值不能綁定到非const 左值引用;所以,如果參數類型是A&,那麼你應該得到一個錯誤。

它還要求轉換可以隱式完成;你可以通過聲明構造函數explicit來阻止這種轉換。

+0

@MikeSeymour或只是[**鏈接**](https://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean) – WhozCraig 2014-08-29 12:46:21

2
A(int n = 0): m_n(n) 
{ 
    std::cout << 'd'; 
} 

這是一個轉換構造函數。當函數需要A類型的參數但提供了int變量時,將使用此轉換構造函數將隱式轉換爲A

爲了避免這種隱式轉換,您可以將explicit說明符添加到您的構造函數中。

explicit A(int n = 0): m_n(n) 
{ 
    std::cout << 'd'; 
}