文章目录
1 const修饰函数参数
保护函数参数的内容不被意外修改
1.1 const 用于修饰“指针传递”的参数,以防意外改动指针所指数据
举个例子:
void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。
给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。
1.2 不要给值传递的参数加const修饰
例如不要将函数 void Func1 (int x) 写成 void Func1(const int x)。
同理不要将函数 void Func2(MyClass a) 写成void Func2(const MyClass a)。其中 MyClass 为用户自定义的数据类型。
解析:
输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
应该尽量要避免值传递:
(1)值传递会发生多次初始化和赋值的行为,开销较大。采用引用这种方式传递,没有新对象创建,所以自然没有构造和析构函数的调用。
(2)值传递的对象在多态行为中,子类会发生对象切割。需要采用引用传递。
建议采用引用传递:“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。
- 自定义的类型:采用const + 引用的形式提高效率并防止意外修改的风险
- 内置类型和stl:采用值传递,内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
2 const修饰函数返回值
2.1 const 修饰函数返回值(返回指针)
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
举个例子:
例如函数
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
2.2 const 修饰函数的返回值(返回引用)
将函数MyClass GetObj(void) 改写为const Myclass & GetObj(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
事实上,函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
2.3 const 修饰函数返回值(值传递)
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。