在成员函数末尾添加const是一种好习惯 - 在适当的地方?

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正确性是一个好主意有两个原因:它是一个便宜的(就你的时间而言)断言可以发现错误; 并且,它表明函数理论上不应该修改对象的外部状态,这使得代码更容易理解.


Naw*_*waz 5

每次函数不修改对象时,即每次函数"符合"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)