const
1. 使用const 提高函数的健壮性
我们知道const常量,但是却不知道const更大的魅力:
修饰函数的参数。返回值,甚至函数的定义体。
const 是constant的缩写,是恒定不变的意思,被const修饰的东西都受到强制保护,可以预防意外的变动,能够提高函数的健壮性。
(1) 用const 修饰函数的参数
如果参数作为输出用,不论它是什么数据类型,也不论是指针传递还是引用传递,都不用加const 修饰,否则该参数将失去输出功能。
Const 只能修饰输入参数。
如果输入参数用指针传递,那么加上const 可以防止意外改动该指针,起到保护的作用。
Void StringCopy(char *strDestination,const char *strSource)
如果输入参数用值传递,由于函数会自动产生临时变量用于复制该参数,该输入参数无需保护,就不用加const
不需要把void fun(int x)写成void fun(const int x);
同理不要把void fun2(A a)写成void fun2(const A a);
对于非内部数据类型而言,声明成void fun2(const A a); 效率比较低,因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造,复制,析构都需要消耗时间
为了提高效率,可以将函数声明改为void fun2(A &a);
引用传递仅仅借用参数的别名而已,不需要产生临时对象,但是引用传递有可能改变参数的值,所以我们把它声明为void fun2(const A &a);
以此类推,我们用不用把void fun(int x)改为 void fun(const int &a),以提高效率????
内部数据类型不存在构造析构过程,“值传递”和“引用传递”的效率也相当快,所以完全没有必要。
内部数据类型 | 不要将“值传递”的方式改为“const 引用传递” 否则既不能提高函数的执行效率,还降低了函数的可读性。 Void fun(int x)不应改为void fun(const int &x) |
非内部数据类型 | 应该讲“值传递”的方式转换为“引用传递” 可以提高效率 Void fun(const A a)应该改为Void fun(const A &a) |
(2)用const 来修饰函数的返回值
如果以“指针传递”方式的函数加const 修饰,那么函数返回值(即指针的内容)(指针的指向)不能改变,
该返回值只能被赋给加const修饰的同类型的指针。
Const char *GetString(void);
char *str = GetString();//出现错误
改为:
Const char *str = GetString();//成功
如果返回值采用“值传递的方式”,由于函数会把返回值复制到外部临时存储单元中,加const没有任何价值。
不要把int GetInt(void) 写成const int GetInt(void);
同理,不要把函数A GetA(void)写成 A GetA(void)
A 为用户自定义类型。
返回值采用引用传递的场合不多,一般出现在类的赋值函数中,目的是为了支持链式表达式
(3)const 数据成员
任何不会修改const 数据成员的函数都应该声明为const 类型,如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其他非const 成员函数,编译器就会指出错误,会提高函数的健壮性。