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,然后为什么在我们用空参数调用方法时值赋值,并且值赋值给变量得到了位置。当我们传递其他值时,它不会产生任何错误。
答案 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)
这是默认参数的定义。