(3)用const修饰函数的参数和函数的返回值
在定义函数时常用到const,主要是用来修饰参数和返回值。这样做的目的是让编译器为程序员做变量只读性的检查,以使程序更加健壮。下面是一个例子。
1. #include <iostream>
2.
3. void disp1(const int &ri)
4. {
5. std::cout<<ri<<std::endl;
6. }
7. void disp2(const int i)
8. {
9. std::cout<<i<<std::endl;
10. }
11. const int disp3(const int &ri)
12. {
13. std::cout<<ri<<std::endl;
14. return ri;
15. }
16. int& disp4(int &ri)
17. {
18. std::cout<<ri<<std::endl;
19. return ri;
20. }
21. const int& disp5(const int &ri)
22. {
23. std::cout<<ri<<std::endl;
24. return ri;
25. }
26.
27. int main()
28. {
29. int n = 5;
30. disp1(n);
31. disp2(n);
32. disp3(n);
33. disp4(n)=6;
34. disp5(n); //disp5(n)=6;是错误的
35. return 0;
36. }
复制代码
程序的输出结果为:
5
5
5
5
6
阅读上面的程序要注意这样几个要点:
①用const修饰函数的参数时,主要将被引用对象或被指向的对象声明为常量,如果是将传值调用的形参声明为常量,则没有多大实用价值。在上例中,void disp2(const int i)这样的声明就没有多少意义,因为形参i是否在函数体内改变,并不影响实参的值,所以将i声明为常量虽然在语法上没有错,但没有实用价值。不但如此,如果同时定义一个相似的(没有用const修饰参数)的函数,还会引起重定义错误,如下面的程序。
1. #include<iostream>
2.
3. void f(int i)
4. {
5. std::cout<<"int"<<std::endl;
6. }
7. void f(const int i)
8. {
9. std::cout<<"const int"<<std::endl;
10. }
11.
12. int main()
13. {
14. f(3);
15. int num = 6;
16. f(num);
17. }
复制代码
在这个程序当中,定义了两个名为f的函数,一个函数原型为void f(int),另一个函数原型为void f(const int),由于都是采用传值调用,而任意的整型表达式的值都可以传送给int型参变量,也可以传送给const int型参变量,所以这两个函数之间并不构成重载,而是发生重定义错误。
②当函数的返回值是一个普通数据,而不是引用时,用const修饰函数返回值也没有多少意义。因为这时函数的返回值是一个非左值,本来就不能够改变其值。在例4中,const int disp3(const int &ri)对返回值的const限定是多余的。
③如果函数的返回值为引用,那么用const修饰返回值可以阻止对被引用对象的修改。例如disp5(n)=6;是错误的,原因是函数disp5()的返回值被声明为常引用。