![](/img/trans.png)
[英]Should I declare method “const” if it is “shallow const” only, not “deep 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.