1

可能重复:
const (c++) 是可选的吗?
常量成员函数

我已经看到了不同的帖子int a() const。我的问题是我们为什么要把const关键字放在那里?我知道它会阻止我们对函数所在的类的成员进行更改,但那又如何呢?

我们可以在函数上方写一个注释,告诉编码器不要对函数内部的类本身进行任何更改,但是为什么我们真的关心声明const之后的内容呢?void例如,在哪些情况下可能有更好的方法来使用int a() const而不只是int a()编译的代码是否会发生变化?

4

3 回答 3

7

它的确有所作为。考虑A成为一个有print()方法的类。然后这个:

const A a;
a.print();

只有 compilesprint被定义为const.

当然,最主要的原因是为了防止对类内部的对象进行任何更改。这

我们可以在函数上方写一个注释并告诉编码器不要对函数内部的类本身进行任何更改

只是一厢情愿。这不会真的发生。因此,如果有人不阅读评论(或阅读并忽略它),您将收到编译器错误。

优化还有一个好处——编译器可以更好地并行处理const对象上的任务,因为它可以假设它们在对它们的操作之间不会发生变化。

于 2013-01-14T13:55:58.703 回答
6

使用const函数的三个基本原因:

1) C++ 只允许 const 引用可以绑定到临时对象。但是如果你没有有用的 const 函数,那么 const 引用就毫无用处。

2) 一些库,例如 C++ 标准库,提供了仅适用于 const 函数的特定语义保证。例如,您可以在标准集合上保证可以同时从多个线程访问集合的 const 函数。

3)它允许编译器捕捉到容易犯的错误。例如,如果您打算依赖 C++ 标准容器保证,如果您使用 const 对象,则只能调用 const 函数。所以一个错误,比如有人修改代码忘记了并发问题,会在编译时被发现。(而不是当有人依靠你的程序来做真正的工作时。)

于 2013-01-14T13:57:13.230 回答
2

声明成员函数 const 的好处是,如果您修改对象,编译器将发出错误。所以,即使你不小心修改了对象,编译器也会发现你的错误。

于 2013-01-14T13:56:34.407 回答