[C++]缺省值和函数重载
1. 缺省值1.1. 缺省值概念缺省参数是声明或定义函数时为函数参数指定一个缺省值。在调用该函数时如果没有指定形参则采用该形参的缺省值否则使用指定的实参。带有缺省值参数的函数代码#includeiostreamusingnamespacestd;//缺省值函数voidFunc1(constchar*strFunc1)//默认参数str指向字符串常量Func1{coutstrendl;}intmain(){Func1();//不传入参数则采用该形参的缺省值Func1Func1(I can rewind time!);//如果指定了实参则采用指定了的参数return0;}代码运行结果Func1 I can rewind time!1.2. 缺省值参数的分类1.2.1. 全缺省参数#includeiostreamusingnamespacestd;//全缺省//默认立方体的长宽高都为1voidbox(doublelength1,doublewidth1,doubleheight1){cout长:lengthendl;cout宽:widthendl;cout高:heightendl;coutendl;}intmain(){box();box(10);//length指定了实参 另外两个为缺省值box(10,20);//lenght和widht指定了实参 heihgt为缺省值box(10,20,30);//三个都指定了实参缺省值不使用return0;}代码运行结果长:1 宽:1 高:1 长:10 宽:1 高:1 长:10 宽:20 高:1 长:10 宽:20 高:301.2.2. 半缺省参数#includeiostreamusingnamespacestd;//半缺省参数//立方体的高度默认为10 长度和宽度需要指定形参voidbox1(doublelength,doublewidth,doubleheight10){cout长:lengthendl;cout宽:widthendl;cout高:heightendl;coutendl;}intmain(){//box1(); //错误需要指定两个形参//box1(10); //错误需要指定两个形参box1(10,20);//lenght和widht指定了实参 heihgt为缺省值box1(10,20,30);//三个都指定了实参缺省值不使用return0;}代码运行结果长:10 宽:20 高:10 长:10 宽:20 高:301.3. 注意事项函数的声明与定义分离时缺省值只需在声明时给出。如果声明和定义都给出了缺省值编译器无法知道要使用哪一边的缺省值会导致编译报错。半缺省值只能从函数参数的右边到左边依次给出不能从左到右给或者是间隔着给函数传参时也不能间隔着传。缺省值必须是全局变量或常量。C语言编译器不支持缺省值。2. 函数重载2.1. 函数重载的概念C允许同一函数名定义多个函数而这些函数的参数个数、参数类型、参数的顺序和返回值可以不相同。这就是函数重载(function overloading) 。 即对一个函数名重新赋予它的新的含义使一个函数名可以多用。所谓重载其实就是“一物多用”。2.2. 函数的重载条件2.2.1. 参数的类型的不同#includeiostreamusingnamespacestd;//函数的参数类型不同//两种不同类型的加法运算函数//如果Add传入的是两个int类型的参数则执行下面这个函数intAdd(intx1,intx2){returnx1x2;}//如果Add传入的是两个double类型的参数则执行下面这个函数doubleAdd(doublex1,doublex2){returnx1x2;}intmain(){inti15,i26;doubled15.6,d26.5;couti1 i2 Add(i1,i2)endl;coutd1 d2 Add(d1,d2)endl;return0;}运行结果5 6 11 5.6 6.5 12.12.2.2. 参数的个数不同#includeiostreamusingnamespacestd;//参数的个数不同voidFunc2(){coutFunc2()endl;}voidFunc2(inta){coutFunc2(int a)endl;}voidFunc2(inta,intb){coutFunc2(int a,int b)endl;}intmain(){Func2();Func2(1);Func2(1,2);return0;}运行结果Func2() Func2(int a) Func2(int a,int b)2.2.3. 参数的顺序不同#includeiostreamusingnamespacestd;//当参数的个数和类型都相同时//参数的顺序不同voidFunc3(inta,doubleb){coutFunc3(int a,double b)endl;}voidFunc3(doublea,intb){coutFunc3(double a,int b)endl;}intmain(){inta0;doubleb0;Func3(a,b);Func3(b,a);return0;}运行结果Func3(inta,doubleb)Func3(doublea,intb)2.3. 注意事项函数的重载必须满足上述的三个条件之一参数的类型、个数、顺序不同。函数重载会存在二义性问题。C语言编译器不支持函数重载。二义性问题例子#includeiostreamusing namespace std;//函数重载的二义性问题intAdd(int x1,int x2){returnx1x2;}//如果Add传入的是两个double类型的参数则执行下面这个函数doubleAdd(double x1,double x2){returnx1x2;}intmain(){int a5;double b5.5;Add(a,b);//这里传入的是整形的a和双精度类型的breturn0;}出现编译报错有多个 重载函数 Add 实例与参数列表匹配: “Add”: 重载函数具有类似的转换原因是这里传入的参数对执行的重载函数存在二义性。变量a是整形而变量b是双精度性如果我们将其混合传入Add函数中Add的两个重载函数都可以接收a和b来执行对应操作 因为int类型和double类型存在隐式类型转换。编译器分不清用户具体想执行的是哪个重载的Add函数就会产生二义性从而发生编译报错。代码示例存在的二义性编译器将int a隐式类型转化为double型则执行Add(double, double)这个函数编译器将double b隐式类型转化为int型则执行Add(int, int)这个函数解决办法是在传入参数时对a或b进行显式强制类型转化消除二义性 修改代码如下#includeiostreamusing namespace std;//函数重载的二义性问题intAdd(int x1,int x2){returnx1x2;}//如果Add传入的是两个double类型的参数则执行下面这个函数doubleAdd(double x1,double x2){returnx1x2;}intmain(){int a5;double b5.5;//Add(a, b);//这里传入的是整形的a和双精度类型的b//显式强制类型转化coutAdd(double(a),b)endl;coutAdd(a,int(b))endl;return0;}运行结果10.5 10