const

来源:互联网 发布:淘宝网买剃须刀片 编辑:程序博客网 时间:2024/06/10 20:15

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 成员函数,编译器就会指出错误,会提高函数的健壮性。

 








0 0