2011-04-21 258 views
-2
void volume(int l=10, int w=10, int h=10); 
int main() 
{ 
    clrscr(); 
    volume(); //equivalent to volume(10,10,10) 
    volume(5); //equivalent to volume(5,10,10) 
    volume(8,6); //equivalent to volume(8,6,10) 
    volume(6,7,8); 
    getch(); 
    return 0; 
} 

void volume(int l, int w, int h) 
{ 
    cout<<"volume = "<<l*w*h<<endl; 
} 

所以現在我的問題是,我們使用的是按值傳遞,那麼爲什麼值分配時我們稱之爲空參數和值assignd給變量的方法得到的地方。當我們傳遞其他值時,它不會產生任何錯誤。默認參數++

+14

什麼?請更清楚地重述這個問題。 – 2011-04-21 18:33:29

+0

對不起,你的問題不清楚。您剛剛描述了默認參數如何在C++中工作。現在你問「爲什麼」?那麼,唯一的答案就是這就是默認參數在C++中的工作原理。這就是語言的定義。這是你「爲什麼」問題的唯一答案。 – AnT 2011-04-21 18:34:04

+0

你上面的例子可能不是最佳實踐。 – 2011-04-21 18:34:40

回答

3

因爲語言設計這樣的工作!

或者,你問的編譯器如何使得它的工作?
該標準沒有指定它應該如何工作。

但潛在的一個解決方案是將產生幕後四種方法:

void volume() 
{ 
    volume(10, 10, 10); 
} 
void volume(int l) 
{ 
    volume(l, 10, 10); 
} 
void volume(int l, int w) 
{ 
    volume(l, w, 10); 
} 
void volume(int l, int w, int h) 
{ 
    cout<<"volume = "<<l*w*h<<endl; 
} 

或者編譯器可以在調用點注入塔參數:

// source 
volume(5); 
// Compiler actually transforms the source (internally) and compiles: 
volume(5, 10, 10); 
1

的語法這​​裏使用:

void volume(int l=10, int w=10, int h=10); 

是位編譯好的岬的簡化以後的調用。

編譯器不產生用更少的參數的函數,也不插入參數到函數本身,它只是使用它們,當你調用該函數。

這也是爲什麼他們只需要指定一次,當你有頭文件和代碼文件,最好在標題中把(其中電話可以看到他們和編譯器可以做出相應的反應)。

因此,當你有

void volume(int l=10, int w=10, int h=10); 

,並呼籲

volume(5, 3); 

編譯器看到的默認值,處理它們,並調用

volume(5, 3, 10); // 10 from the default 
+0

是的,當我們將該值傳遞給參數時,會問這個問題,那麼我們該如何改變它。它不是多次初始化一個變量。 – avirk 2011-04-21 18:42:15

+0

我不確定你的意思。如果你傳遞價值觀,你不能只改變這些;那需要傳遞一個引用或指針。因爲編譯器正在處理默認值,所以你不會傳入一個可以稍後更改的變量。 – ssube 2011-04-21 18:45:20

0

這些任務在聲明volume()被稱爲默認參數,如果您在調用函數時忽略參數的值,則會使用它們。

0

這就是所謂的默認分配。你告訴編譯器如果沒有提供值,使用10

0

這是默認參數的定義。