2010-12-08 35 views
6

我正在審查我的最後,我不明白爲什麼這個問題是什麼。C++類問題

假定以下類聲明:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

假定以下行的代碼試圖在一個main()程序,和x是Testing型的,並已propertly創建。

x.Show(18);合法或非法

答案是合法的,據我所知,是沒有必要,因爲= 10的第二個參數,但由於18不是Testing類型的不是一個無效的參數?

回答

16

測試有一個非 - explicit構造函數,它接受一個int。因此,通過構造一個臨時對象,可以將int隱式轉換爲Testing

因爲Show需要const Testing &(而不僅僅是Testing &),所以您可以傳遞臨時文件給它。最後,第二個參數是可選的,所以你不必爲它指定一個值。

這整個機制是什麼讓你這樣做,順便說一句:

void f(const std::string &str); 
// ... 
f("Hello"); 

這裏,"Hello"const char (&)[6]類型,其衰減到const char *的,但你可以從const char *構建std::string,從而允許使用const char *,其中需要std::string參數。

請記住,這構造了一個臨時的,因此只對通過值或const引用傳遞的參數(它將失敗的引用)有效。此外,構造函數不得標記爲explicit

+0

謝謝,有幾個很好的答案,但這是非常徹底的。感謝您花時間給我一個解釋。 – dubyaa 2010-12-08 21:23:10

3

的此處構造:

Testing(int n); 

提供從intTesting的隱式轉換,並且這然後匹配的原型爲Show,與所述第一參數不同於所述int 18構成的Testing實例,並且第二參數是默認值10

如果防止這樣的隱式轉換:

explicit Testing(int n); 

代碼不會編譯。

5

由於Testing有一個接受int的構造函數,因此該C-tor用於爲第一個參數自動構造一個Testing對象。該代碼實際上最終工作是這樣的:

x.Show(Testing(18)); 
6

有一個在C++自動轉換,稱爲implicit conversion sequences的概念。在這樣的序列中,最多一次轉換可能是用戶定義的轉換,並且調用臨時對象的構造函數是用戶定義的轉換。可以在這裏創建一個臨時的,因爲它會綁定到const引用,並在Show()調用完成時被銷燬。