分享

C++缺省参数和函数重载

 复杂网络621 2014-09-12

  参数的缺省值

在C++中参数可以设置缺省值,设置了缺省值之后,这个参数在调用时可以省略。

注意:设置缺省值的参数只能是最后的几个参数。也就是说某一个参数一旦设置了缺省值,其后而的参数也必须设置缺省值。例如:f()函数有3个参数,如果只设置第2个有缺省值,这就错了。因为调用时只输入2个参数时,系统不知道究竟是第2个参数还是第3个参数。

参数缺省值举例:
  1. #include <iostream>
  2. using namespace std;
  3. int sum(int x=0, int y=100, int z=0) { return x+y+z; }
  4. //int sum(int x, int y=100, int z=0) { ... } //这是正确的
  5. //int sum(int x, int y, int z=0) { ... } //这也是正确的
  6. //int plus(int x, int y=100, int z) { ... } //这是错误的
  7. int main ( )
  8. {
  9. cout << sum() << endl;
  10. cout << sum(6) << endl;
  11. cout << sum(6, 10) << endl;
  12. cout << sum(6, 10, 20) << endl;
  13. return 0;
  14. }
运行结果:
100
106
16
36

函数的重载

函数的重载在C++中具有重要作用,重载(overload)不要和后面要学的覆盖(override)混淆起来。重载是指相同的函数名,但参数的类型或个数中只要有所不同,便进行再定义,编译之后重载的函数都具有不同的地址,也就是说虽然函数名相同,实际上是不同的函数,在调用时,编译系统会根据不同之处自动区别是调用哪一个函数。对于普通函数和后面要学的类的成员函数都适用。

覆盖只对类的构造函数或成员函数适用,是子类继承父类是才使用的非常有用的功能。重载可以针对运算符,而覆盖不行。上一节中缺省值的设置,实际上在编译时等价于重载,被生成了4个不同的函数。

早期的C++版本,在定义重载函数时要加上关键字overload,现在不用了。在使用重载函数时,如果有类型的自动转换时要特别注意,初学者往往出错在这儿。

函数重载举例:
  1. #include <iostream>
  2. using namespace std;
  3. float fun(float x);
  4. double fun(double x);
  5. int main ( )
  6. {
  7. float f = 132.64;
  8. double d = 132.64;
  9. cout << fun(f) << endl;
  10. cout << fun(d) << endl;
  11. //cout << fun(5) << endl; //编译错,参数5可以转换为float,也可转换为double
  12. return 0;
  13. }
  14. float fun(float x)
  15. {
  16. return x / 2.0 ;
  17. }
  18. double fun(double x)
  19. {
  20. return x / 3.0;
  21. }
运行结果:
66.32
44.2133

设计时的重载错误

上面的例子中,设计时并没有问题,调用时类型自动转换时发生了二义性。下面列举的重载函数是设计时就出了问题,两个函数本身就具有重复的意义。
  1. #include <iostream>
  2. using namespace std;
  3. int fun(int a, int b);
  4. int fun(int a, int &b);
  5. int main ( )
  6. {
  7. int x=1, y=2;
  8. cout << fun(x, y) << endl; //这句编译时出错
  9. return 0;
  10. }
  11. int fun(int a, int b);
  12. {
  13. return a + b;
  14. }
  15. int fun(int a, int& b);
  16. {
  17. return a - b;
  18. }
上面例子用到了int&,这叫“引用”,关于什么是“引用”参见下一章。

重载函数的地址

这里使用函数指针来取得函数的地址,有关函数指针已经在C语言教程中介绍,请参考C语言函数指针
  1. #include <iostream>
  2. using namespace std;
  3. void space(int count);
  4. void space(int count, char ch);
  5. int main ( )
  6. {
  7. //有一个整型参数的函数指针
  8. void (*fp1)(int);
  9. //有一个整型参数、一个字符型参数的函数指针
  10. void (*fp2)(int, char);
  11. fp1 = space; //取space(int)函数的地址
  12. fp2 = space; //取space(int, char)函数的地址
  13. fp1(20); //输出20个空格
  14. cout << "|" << endl;
  15. fp2(20, '='); //输出20个等号
  16. cout << "|" << endl;
  17. return 0;
  18. }
  19. //输出count个空格字符
  20. void space(int count)
  21. {
  22. for ( ; count; count--) cout << ' ';
  23. }
  24. //输出count个ch字符
  25. void space(int count, char ch)
  26. {
  27. for ( ; count; count--) cout << ch;
  28. }
输出结果:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多