2011-05-16 82 views
2

我看着我的講師的視頻從我的大學,他說關於Rational類,它的構造是這樣的:這個構造函數爲什麼可以用一個參數聲明?

Rational (int top=0 , int bottom=1) 
: t(top) , b(bottom) {normalize();} 

到現在爲止一切都OK了,但是!他還說你可以只用1個參數(頂部參數)調用構造函數,並且因爲該底部初始化爲1的合理值,例如:Rational(3)將是3/1

但是!!我想知道我們如何才能使用1值的構造函數只有它只支持2個參數?

我知道,在的java如果我們的論點,即構造得到的x個(不考慮其他構造以及x> 0),我們必須轉移他們的所有2不是1,而不是...

請幫我解決這個矛盾?

日Thnx ...

回答

10

在構造函數聲明中的=給參數默認值。如果您在調用構造函數時未自己提供值,則編譯器將爲您填充聲明的默認值。構造函數不會知道它的區別 - 它會看到兩個參數,並且它無法檢測調用者是否提供了這兩個值,或者編譯器是否填充了其中的一些值,但通常這是正常的。 (如果你需要知道其中的差別,然後聲明多個構造函數,每個參數的不同的號碼,沒有默認值。)

你的構造甚至可以沒有參數來調用,因爲它們都有默認值。在這種情況下,第一個參數的默認值爲0,第二個參數的值爲1.

只能從結尾刪除參數值。也就是說,不能省略參數bottom而不能省略參數top。您給出的第一個實際參數將始終對應於聲明中的第一個形式參數。同樣,只能從最後開始定義默認參數。您不能爲top定義默認參數,也不要爲bottom聲明一個。

2

當你這樣做:

Rational r(42); 

...的1默認值提供給參數bottom,因爲你的構造函數的參數bottom默認值。 (這是該=1約)

如果你要改變個構造函數的聲明中不包括任何默認設置:

Rational(int top, int bottom) 

...那麼你將不再能夠構建一個Rational對象而不明確指定兩個參數。

0

topbottom是具有隱含值的參數。這意味着您可以在調用函數時跳過它們,並使用它們的隱式值來調用函數。

因此,與給定的構造函數,你可以說Rational r;和R將有頂0和底部1,或Rational r(42),巫頂殼將是42和底部1,或Rational r(1,2);和頂部1和底部2

2

爲了延長羅伯肯尼迪的答案,這裏是什麼呢,不工作的幾個例子:

試想一個類Foo:

class Foo 
{ 
    Foo(int a = 0, float b = 1.0f); 
} 

,並考慮以下構造函數調用:

Foo foo_obj = Foo(5, 6.0f); // Fine, two arguments are passed. a will be 5 and b will be 6.0f. 

Foo foo_obj = Foo(5);   // Fine as well. a will be 5 and b will be 1.0f. This is because b has a default value in the constructor. 

Foo foo_obj = Foo();   // Fine too, a will be 0 and b will be 1.0f. This is because both a and b have default values in the constructor. 

請注意,變量仍然是從左到右傳遞的。通過這個,我的意思是,你不能排除任何你想明確傳遞的論點之前的論點。由此我的意思是在上面的例子中,你不能爲b傳遞一個值,但是爲a留出一個值。

相關問題