【问题标题】:Why const after void/int declaration? [duplicate]为什么在 void/int 声明后使用 const? [复制]
【发布时间】:2013-01-14 13:54:25
【问题描述】:
可能重复:
is const (c++) optional?
Constant Member Functions
我看到过关于int a() const 的不同帖子。我的问题是为什么我们要把const 关键字放在那里?我知道它会阻止我们对函数所在的类的成员进行更改,但那又如何呢?
我们可以在函数上方写一个注释,告诉编码器不要对函数内部的类本身进行任何更改,但为什么我们真的关心void 声明之后的const?在哪些情况下可能有更好的使用方式,例如 int a() const 而不仅仅是 int a(),编译后的代码是否会发生变化?
【问题讨论】:
标签:
c++
function
constants
【解决方案1】:
它确实有所作为。将A 视为具有print() 方法的类。那么这个:
const A a;
a.print();
仅编译为print 定义为const。
当然,主要是为了防止对类内部的对象进行任何更改。
我们可以在函数上方写一个注释,告诉编码器不要对函数内部的类本身进行任何更改
只是一厢情愿。这不会真的发生。因此,如果有人不阅读评论(或阅读并忽略它),您将收到编译器错误。
优化还有一个好处 - 编译器可以更好地并行处理 const 对象上的任务,因为它可以假设它们在对它们的操作之间不会发生变化。
【解决方案2】:
使用const函数的三个基本原因:
1) C++ 只允许 const 引用可以绑定到临时对象。但是如果你没有有用的 const 函数,那么 const 引用就毫无用处。
2) 一些库,例如 C++ 标准库,提供仅适用于 const 函数的特定语义保证。例如,您可以在标准集合上保证您可以同时从多个线程访问集合的 const 函数。
3) 它允许编译器捕捉到容易犯的错误。例如,如果您打算依赖 C++ 标准容器保证,如果您使用 const 对象,则只能调用 const 函数。所以一个错误,比如有人修改代码忘记了并发问题,会在编译时被发现。 (而不是当有人依赖你的程序做实际工作时。)
【解决方案3】:
声明成员函数 const 的好处是,如果您修改对象,编译器将发出错误。所以,即使你不小心修改了对象,编译器也会发现你的错误。