C++之const的用法(1)

本文详细解释了C++中const修饰符在函数参数及返回值中的应用,包括如何使用const保护指针所指向的数据,以及在不同场景下const修饰符的有效性和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)值传递的对象在多态行为中,子类会发生对象切割。需要采用引用传递。

建议采用引用传递:“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。

  1. 自定义的类型:采用const + 引用的形式提高效率并防止意外修改的风险
  2. 内置类型和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 修饰没有任何价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值