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();. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |