14年前就关闭了。社区在2天前审查了是否重新讨论此问题,并将其关闭:原始关闭原因未解决对于门外汉来说,在C++(和C)中使用const有什么好处?
k3fezbri1#
Const对于传递给函数的指针或引用特别有用--它是一种易于理解的"API契约",函数不会更改传递的对象。另见:www.example.comhttp://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.4
t2a7ltrp2#
当在函数中用作常量引用时,它让 caller 知道传入的内容不会被修改。
void f(Foo &foo, const Bar &bar) { ... }
在这种情况下,调用者会知道foo可能被修改,但bar不会,编译器会在编译f()的主体时强制执行这一点,这样bar就不会被修改,也不会传递给其他可能修改它的函数。使用const_cast可以绕过上述所有安全措施,这就是为什么这样的强制转换被认为是“危险的”(或者至少是可疑的)。
foo
bar
f()
const_cast
h6my8fg23#
看起来很明显-它阻止你修改不应该修改的东西。编辑:要获得更多指导,请始终查看Herb Sutter。
wnrlj8wa4#
我对const的“安全性”方面并不十分确信(有优点也有缺点)......但是,它确实允许使用某些语法,而没有const就无法使用这些语法
void blah(std::string& x) {}
只能接受std::string对象...但是如果声明它为const:-
void blah(const std::string& x) {}
你现在可以
blah("hello");
它将调用适当的构造函数来生成std::string
rhfm7lfc5#
另外,通过使用const,你可以声明你使用变量或参数的 * 意图 *,这是一个很好的编程实践(“C/C++ Coding Style & Standards“,第2.3条)。此外,通过避免使用#define定义常量和使用const,可以提高代码的类型安全性。C++ Programming Practice Guidelines- item 2.1
jei2mxaa6#
const的契约方面对于编译器的优化器也很重要。使用某些const声明,优化器更容易发现涉及循环不变量的优化。这就是为什么const_cast非常危险。
6条答案
按热度按时间k3fezbri1#
Const对于传递给函数的指针或引用特别有用--它是一种易于理解的"API契约",函数不会更改传递的对象。
另见:www.example.comhttp://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.4
t2a7ltrp2#
当在函数中用作常量引用时,它让 caller 知道传入的内容不会被修改。
在这种情况下,调用者会知道
foo
可能被修改,但bar
不会,编译器会在编译f()
的主体时强制执行这一点,这样bar
就不会被修改,也不会传递给其他可能修改它的函数。使用
const_cast
可以绕过上述所有安全措施,这就是为什么这样的强制转换被认为是“危险的”(或者至少是可疑的)。h6my8fg23#
看起来很明显-它阻止你修改不应该修改的东西。
编辑:要获得更多指导,请始终查看Herb Sutter。
wnrlj8wa4#
我对const的“安全性”方面并不十分确信(有优点也有缺点)......但是,它确实允许使用某些语法,而没有const就无法使用这些语法
只能接受std::string对象...但是如果声明它为const:-
你现在可以
它将调用适当的构造函数来生成std::string
rhfm7lfc5#
另外,通过使用const,你可以声明你使用变量或参数的 * 意图 *,这是一个很好的编程实践(“C/C++ Coding Style & Standards“,第2.3条)。
此外,通过避免使用#define定义常量和使用const,可以提高代码的类型安全性。C++ Programming Practice Guidelines- item 2.1
jei2mxaa6#
const的契约方面对于编译器的优化器也很重要。使用某些const声明,优化器更容易发现涉及循环不变量的优化。这就是为什么const_cast非常危险。