Edo*_*doz 13 c++ const const-correctness
在C++中,每次函数不修改对象时,在每次函数"符合"const的情况下,在成员函数定义的末尾添加const是一种很好的做法吗?我知道在这种情况下有必要:
class MyClass {
public:
int getData() const;
};
void function(const MyClass &m) { int a = m.getData(); dosomething... }
Run Code Online (Sandbox Code Playgroud)
但除此之外,以及const对实际功能的其他用途,确实在最后添加const实际上改变了代码的执行方式(更快/更慢),或者它只是编译器处理诸如一个案例的'标志'以上?换句话说,如果类中的功能不需要const(最后),添加它会有什么不同吗?
Nei*_*l G 18
请参阅Herb Sutter(C++标准委员会秘书长达10年)关于const正确性的优秀文章.
关于优化,他后来写了这篇文章,他说"const主要是针对人类,而不是编译器和优化器".优化是不可能的,因为"太多事情可能会出错...... [你的函数]可能会执行const_casts."
然而,const正确性是一个好主意有两个原因:它是一个便宜的(就你的时间而言)断言可以发现错误; 并且,它表明函数理论上不应该修改对象的外部状态,这使得代码更容易理解.
每次函数不修改对象时,即每次函数"符合"const的条件时?
在我看来,是的.它确保您在涉及对象的const对象或const表达式上调用此类函数:
void f(const A & a)
{
a.inspect(); //inspect must be a const member function.
}
Run Code Online (Sandbox Code Playgroud)
即使它修改了一个或几个内部变量一次或两次,即使这样我通常也会将其作为const成员函数.这些变量用mutable关键字声明:
class A
{
mutable bool initialized_cache; //mutable is must!
public:
void inspect() const //const member function
{
if ( !initialized_cache)
{
initialized_cache= true;
//todo: initialize cache here
}
//other code
}
};
Run Code Online (Sandbox Code Playgroud)