簡體   English   中英

我應該聲明任何可以是const const方法的方法

[英]Should I declare any method that can be const a const method

簡單的問題。 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:基類虛函數。 繼承類不能通過重寫的函數來改變它可能是一件好事,但是一些開發人員可能不同意並且因為這個而真的必須跳過箍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM