如何减少const的传染性?

准则1,如果你不想修改一个变量的值或者想让这个变量内联,那么就将这个变量声明为const

const int max = 1000;
const char* name = "parmanent name";

这些变量可以是全局变量,同样也可以是局部变量,将它们声明为一个全局变量可以促进它们的内联机会,并可以防止没有必要的修改。

下面一条准则是关于函数的

准则2,作为一个函数,对接收的值要self-disciplined, 对返回的值要relaxed.

这意味着,如果你能完全确定在一个函数中没有任何机会可以修改参数的值,那么就在它上面加上const, 但是不要在返回值上加const,除非编译器要求你这样做。

这背后的原因需要一点点的思考,在参数上加上const,是告诉别人,你只管传递给我参数,但是我保证不会去改变它的值,(或者说该函数对传来的参数没有任何副作用,我对这个参数很感兴趣)。

这其实是一件好事情,因为函数的调用者不希望它们传进来的参数,被意外的修改,他们需要完整的原始值,因为他们将在您返回后使用它们。

void foo(const char* in);

是否要将const放在参数上,取决于函数不会修改该参数,

但是下面这种情况就会出事情

void foo(const char* in) {
	bar(in);
}
bar(char* in) {...}

首先你无法确定bar函数会不会修改in这个参数,如果会修改参数,你就不可以在foo的参数上放上const

这就是C++让人抓狂的地方,因为其它的函数可能是别人编写的,人家可能不会遵循你的规则,因为这样写是无聊的。

另一个方面,为什么你不应该将const放在返回类型上,因为这中做法是无意义的,这就像现实中别人在死后在遗嘱上写到“我的儿子可以继承我的房子,但是却不可以修改它”。但是这种限制真的可以实现吗?显然是不可以的。

回到编程的上下文中,不允许调用者修改你给它们的东西有什么意义?你应该将这件事情交给调用者来做,即使你做了,当const妨碍它们的时候,它们就会使用const_cast,这就使得返回const类型的值毫无用处。

所以记住不要在返回值类型上加上const。

如果你加上了可能会形成一条污染链

const char* bar();
void baz() {
	const char* ret = bar();
	bizarr(ret);
}
void bizarr(const char* in) {
	bizarr2(in);
}
void bizarr2(const char* in);

所以还是不要在返回值类型上加上一个const

那么将在什么时候在返回值类型上加上const呢?


原文地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值