const在C+中的优势+;? 对于未启动的C++(和C)有什么优点?

const在C+中的优势+;? 对于未启动的C++(和C)有什么优点?,c++,constants,C++,Constants,看起来很明显,它使您不必修改不应该修改的东西。 void f(Foo &foo, const Bar &bar) { ... } 编辑:要获得更多指导,请始终查看。在函数中用作常量引用时,它会让调用方知道传入的内容不会被修改 void f(Foo &foo, const Bar &bar) { ... } 在这种情况下,调用者将知道foo可能会被修改,但栏将不会被修改。编译器在编译f()的主体时将强制执行此操作,这样bar就不会被修改,也不会传递给可能修改它的

看起来很明显,它使您不必修改不应该修改的东西。

void f(Foo &foo, const Bar &bar) { ... }

编辑:要获得更多指导,请始终查看。

在函数中用作常量引用时,它会让调用方知道传入的内容不会被修改

void f(Foo &foo, const Bar &bar) { ... }
在这种情况下,调用者将知道
foo
可能会被修改,但
栏将不会被修改。编译器在编译
f()
的主体时将强制执行此操作,这样
bar
就不会被修改,也不会传递给可能修改它的另一个函数


使用
const_cast
可以绕过上述所有保护措施,这就是为什么这种强制转换被认为是“危险的”(或者至少是可疑的)。

const对于传递给函数的指针或引用特别有用——它是一种即时可理解的“API契约”函数不会更改传递的对象的排序


另请参见:

我不太相信const的“安全性”方面(有优点也有缺点)…但是,它允许的是某些语法,没有const是不行的

void blah(std::string& x)
{}
只能接受std::string对象。。。但是,如果您将其声明为常量:-

void blah(const std::string& x) {}
你现在可以做了

blah("hello");

它将调用适当的构造函数来生成std::string

const的契约方面对编译器的优化器也很重要。对于某些常量声明,优化器更容易发现涉及循环不变量的优化。这就是为什么const_cast是真正危险的。

此外,通过使用const,您可以声明使用变量或参数的意图。这是一个很好的编程实践(“,第2.3项)

另外,通过避免使用#define来定义常量和使用const,可以提高代码的类型安全性。
-第2.1项

…意外:-P const_cast可以很容易地重写。我正要说同样的话。虽然你应该担心未定义的行为,但如果你使用const_cast的方式错误…我认为这是一个完全相同的副本,你可能会发现这很有用。const_cast和mutable的存在明确地阻止编译器基于const限定符进行优化。