我是否应该声明任何可以为const的方法为const方法?

Should I declare any method that can be const a const method

本文关键字:const 方法 任何可 是否 声明      更新时间:2023-10-16

简单的问题。Should I declare any method that can be const a const method?这包括不返回任何成员变量或返回对成员变量的const引用的方法。有什么理由不这样做(除了明显的原因,编译器无论如何都会指出)?

const方法不能通过指向常量对象的指针调用。因此,如果方法可以const,不声明它为const将人为限制其使用。

除此之外,使方法const是一个重要的语义细节,它可以给用户一种调用它所期望的效果的感觉。

看来我要成为不和谐的音符了:

我应该将任何可以是const的方法声明为const方法吗?

不,应该在设计的时候在不同的层次上做决定。您应该将所有在语义上不修改对象的方法标记为const。这可能包括一些方法,这些方法实际上修改了一些内部细节,这些细节不是对象可感知状态的一部分(这些属性应该是mutable),它可能不包括一些根本不改变任何东西的方法。

enum impl {                 // different implementations of the algorithm
   one_implementation,
   another_implementation
};
class example {
   mutable std::pair<bool, int> cache;
protected:
   int a, b;
public:
   example( int a, int b ) : cache(), a(a), b(b) {}
   virtual ~example() {}
   void set( int _a, int _b ) { 
      cache.first = false;      // invalidate previous result 
      a = _a;
      b= _b;
   }
   int expensive_calculation() const {
      if ( !cache.first ) {
         cache.second = calculate();
         cache.first = true;
      }
      return cache.second;
   }
   virtual void change_impl( impl x ) {}
private:
   virtual int calculate() const = 0;
};

在当前的形式中,您不能更改实现,并且change_impl是非const的,即使它不修改任何成员属性,它也不会标记为const,因为在语义上它会更改。

另一方面,expensive_calculation()方法在语义上不修改对象的状态,在调用操作之前和之后的可感知状态将是相同的,但它确实修改了cache属性以加快以后的调用(如果状态没有改变)。因此,方法是const,缓存是mutable

是。根据Effective c++,"尽可能使用const"

如果一个方法不修改对象的逻辑状态,那么您应该将该方法标记为const。对于对象的客户端来说,这是一个很好的服务,因为在给定const引用/指针的情况下,它们可以被充分利用。

有一种情况,我会考虑使用const:一个基类虚函数。继承的类不能被其重写的函数更改,这可能是一件好事,但一些开发人员可能不同意,因此确实不得不跳过一些障碍。