你觉得有帮助吗?
7 回答
每次您知道该方法不会改变对象的状态时,您都应该将其声明为常量。
它有助于阅读您的代码。当您尝试更改对象的状态时,它会有所帮助 - 编译器会阻止您。
尽可能经常地。不需要更改数据成员的函数应声明为 const。这使代码更易于理解,并可能提示编译器进行优化。
当您拥有一个const
对象时,编译器将允许您调用的唯一方法是那些被const
关键字标记为安全的方法。事实上,只有成员方法作为const
方法才有意义。
在 C++ 中,对象的每个方法都接收到一个指向该对象的隐式this
指针;一个const
方法将简单地接收一个const
this
指针。
假设您正在谈论方法,例如:
struct Example {
void f() const;
};
然后,如果它们应该可以在 const 对象上调用,则方法应该是 const。
经常不够……
虽然所有答案都是正确的,但如果您使用的库不是const 正确的,那么很难在所有应该使用它的地方使用 const。
如果您有一个旧 API 采用char *,出于所有逻辑目的应该是const char *,那么您要么必须在代码中忘记 const ,要么进行一些难看的转换。在那种情况下,我会忘记 const。
我几乎在每一个机会都使用 const,并且喜欢它提供意图文档并强制遵守该意图的事实。语言特性并没有比这更好,但奇怪的是 const 不受欢迎。(现实情况似乎是,大多数自称 C++ 的程序员都无法解释和之间的区别int*, int*const, const int*
。const int*const
)
虽然由于它的“C”起源,它永远不会发生,但我经常认为,如果 const 是默认值,并且有必要自由地洒上(比如)“var”或一些类似的关键字来允许后期处理,C++ 会是一种更好的语言。变量的构造修改。
我曾经将函数声明为 const,但现在我很少再这样做了。
主要问题是,如果我想将一个函数从 const 更改为 non-const,这意味着调用该函数的所有其他 const 函数也需要更改为 non-const。
由于优化,这种情况比我想象的更频繁。例如,我有一个 GetData() 函数,它用于返回指向数据的指针,但后来我优化为仅在 GetData() 最终被调用时才设置数据(这会改变对象的状态,因此它不再是 const功能)。
对于其他可以在不改变对象状态的情况下进行一些计算的函数也是如此,但在某些时候缓存结果更有意义,因为该函数被多次调用并且是一个瓶颈。
同样在实践中,至少对于我的项目而言,将我的函数声明为 const 并没有什么好处。