13

对于外行来说,C++(和 C)中的const有什么优势?

4

6 回答 6

12

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

另见: http: //www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.4

于 2009-01-22T02:58:53.610 回答
11

当在函数中用作 const 引用时,它让调用者知道传入的东西不会被修改。

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

在这种情况下,调用者会知道foo可能会被修改,但bar不会。编译器将在编译 的主体时强制执行此操作f(),因此bar永远不会修改它,也永远不会传递给可能修改它的另一个函数。

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

于 2009-01-22T02:57:59.383 回答
6

看起来很明显——它可以防止你修改不应该修改的东西。

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

于 2009-01-22T02:55:36.847 回答
5

我不太相信 const 的“安全”方面(有利也有弊)....但是,它确实允许的是某些语法,如果没有 const,您将无法做到

void blah(std::string& x)
{}

只能采用 std::string 对象...但是,如果您将其声明为 const :-

void blah(const std::string& x) {}

你现在可以做

blah("hello");

它将调用适当的构造函数来创建一个 std::string

于 2009-01-22T03:31:26.117 回答
4

此外,通过使用 const,您可以说明使用变量或参数的意图。这是一种很好的编程习惯(“ C/C++ 编码风格和标准”,第 2.3 条)。

此外,通过避免使用#define 来定义常量并使用 const,您可以提高代码的类型安全性。 C++ 编程实践指南- 项目 2.1

于 2009-01-22T04:04:42.230 回答
-1

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

于 2009-01-22T03:34:54.443 回答