c – 是否尽可能维持“常数”是一个好主意?

前端之家收集整理的这篇文章主要介绍了c – 是否尽可能维持“常数”是一个好主意?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近,我一直在开发一个在我的代码中做许多事情的做法:const:

(1)功能的论据,我知道永远不会改变.例如.:

void foo (const int i,const string s)
          ^^^^^        ^^^^^

(2)返回类型为const.例如.:

struct A {
...
  const int foo () { return ...; }
  ^^^^^
  operator const bool () const { return ...; }
           ^^^^^
};

(3)整数或字符串的简单计算.例如.:

const uint size = vec.size();
^^^^^
const string s2 = s1 + "hello ";
^^^^^

…还有更多的地方.通常在其他现实世界的代码中,我看不到这样的小型变量标记为const.但是我认为,使他们永远不会伤害.这是一个很好的编程实践吗?

解决方法

(1)和(3)密切相关.一个by-value参数只是一个具有该名称的局部变量,同样是您的计算结果.

通常,无论您是否将局部变量const标记为局部变量,短函数都不会有什么区别,因为您可以在整个范围内看到它们的全部范围.您可以看到值是否改变,您不需要或希望编译器强制执行.

然而,它有助于帮助,因为它可以保护您免于意外地将它们传递给使用非const引用的参数,而不会意识到您正在修改变量.因此,如果在生命周期中将变量作为函数参数传递,那么将其标记为const可以让您更有信心,知道它之后有什么价值.

偶尔,标记一个变量const可以帮助优化器,因为你告诉它,对象永远不会被修改,有时这是真的,但编译器不能以其他方式证明它.但是,由于这个原因,这可能不值得,因为在大多数情况下,这并没有什么区别.

(2)是另一回事.对于内置类型,没有什么区别,正如其他人所说明的那样.对于类类型,不要返回const值.这似乎是一个好主意,因为它阻止用户写一些无意义的东西,如func_returning_a_string()=“extra text”;但它也阻止了一些有意义的东西–C11移动语义.如果foo返回一个const字符串,并且我写std :: string s =“foo”; if(condition)s = foo();那么在s = foo();.如果foo返回一个非const字符串,那么我得到移动赋值.

类似地,在没有移动语义的C 03中,它防止了称为“swaptimization”的技巧 – 使用非const返回值,我可以写入foo().swap(s);而不是s = foo();.

猜你在找的C&C++相关文章