const提高函数健壮性

看到const关键字,首先想到是const常量,const更大的作用是它可以修饰函数的参数、返回值,甚至函数的定义体
1.用const修饰函数的参数
如果参数做输出用,不论他是什么数据类型,也不论它采用指针传递还是引用传递都不能加const修饰,否则该参数将失去输出功能。
const只能修饰输入参数:
a、如果输入参数采用指针传递,那么加const修饰可以防止意外的改动该指针,起到保护作用。
b、如果输入的参数采用值传递,由于函数自动产生临时变量用于复制该参数,输入参数就无需保护,所以不需要加const。
c、对于非内部数据类型的参数而言,像void Fun(A a) 这样的函数注定效率比较低,因为函数体将产生A类型的临时对象用于复制该参数a,而临时对象的构造,复制,析构过程都将消耗时间,为了提高效率,可以将函数声明改为void Fun
(A &a) ,因为引用传递仅借用一下参数名而已,不需要产生临时对象,但函数void Fun(A &a), 存在一个缺点,引用传递有可能改变参数a,所以加const即可。
d、以此类推, 是否应将void fun(int a)改写成void fun(const int &a)来提高效率呢? 完全没有必要,因为内部数据类型的参数不存在构造,析构过程,而复制也非常快,值传递和引用传递的效率几乎一样。

2.用const修饰函数的返回值
a、如果给以指针传递方式的函数返回值加const修饰,那么函数返回值(指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
eg:const char *GetString(void);
char *str = GetString(void) //错误
const char *str = GetString(void) //正确
b、如果函数返回采用值传递的方式,由于函数会把返回值复制到外部临时的存储单元中,加const没有任何价值
eg:将int GetInt(void)改写成const GetInt(void) //没有任何价值
A GetA(void) 改成const A GetA(void) //没有任何价值
如果返回值不是内部数据类型,将函数A GetA(void) 改成const A &GetA(void)的确能提高效率,但一定要搞清楚函数究竟是想返回一个对象的拷贝还是仅返回别名就可以了,否则程序会出错。

3.const成员函数(const关键字只能放在函数声明的尾部)
任何不会修饰数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。

猜你喜欢

转载自blog.csdn.net/D_o_nlyone/article/details/83019805