提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
函数这一章看到现在,感觉就定义缺省实参这块比较有趣。
一、缺省实参定义顺序是什么?
从无到有,最开始比较重要的形参无序定义缺省实参,不重要的,默认的等于某个固定参数的形参放在函数最后,可以定义缺省实参,也就是说,一旦定义了缺省实参,那么这个形参后面都要的形参都要定义缺省实参。
下面展示一些 内联代码片
。
void fun(int x,int y=1,int z=2)
{
......
}
为什么要这样写?因为传入的实参是按照从左到右的顺序匹配实参,这样定义可以先让没有被缺省定义的形参先被拷贝实参。
fun(1,2);
//这时实参1优先传给x,2传递给y
当然要注意,时间顺序上,是先把1拷贝给x,还是先把2拷贝给y,不同的编译器不一样,所以要避免写出fun(x++,x++)这种代码。
二、每个翻译单元中,缺省实参只能定义一次
1.一个.cpp文件中缺省实参不能被重复定义
代码如下(示例):
//我们这里引入两个声明,在声明中定义缺省实参,这本身并没有问题,
//问题出在z在两个声明中重复定义了。
void fun(int x,int y=1,int z=2);
void fun(int x,int y,int z=2);
但是,在不同的.cpp文件中,缺省实参是可以重复定义的,因为每个翻译单元在编译期是单独处理的,所以我完全可以再新建一个fun.cpp,在这个新的翻译单元中写一个声明来定义z。
2.缺省实参只能定义一次的意义
这是为了分级指定缺省实参。我们之前提到,在一个函数里,形参的重要性是逐渐降低的,比如x很重要,y相对没那么重要,z的值几乎是默认的。这时我们可以定义一个头文件header.h(根)
void fun(int x,int y,int z=2);
z的值一般不需要被修改,所以我们在这个头文件里给z赋好默认值,以后直接在main函数里引用这个头文件就行了,因为调用头文件相当于把头文件内的声明直接拷贝到main。
然后定义一个头文件header1.h(枝叶),里面存取相对不重要的y
void fun(int x,int y=3,int z);
同样在main里直接调用这个头文件就行
这样,最后在main里面,我们只需要给最重要的x赋值就行了。
fun(1);
总结
这里定义缺省实参的主要用处就是分级指定