c ++中的默认参数

时间:2011-04-21 18:30:22

标签: c++

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;  
} 

所以现在我的问题是我们正在使用pass by value,然后为什么在我们用空参数调用方法时值赋值,并且值赋值给变量得到了位置。当我们传递其他值时,它不会产生任何错误。

5 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

volume()声明中的那些赋值被称为默认参数,如果在调用函数时省略参数的值,则会使用它们。

答案 3 :(得分:0)

它被称为默认分配。您告诉编译器如果没有提供任何值,请使用10。

答案 4 :(得分:0)

这是默认参数的定义。