[英]Should member functions be “const” if they affect logical state, but not bitwise state?
我正在編寫一個包含控制硬件設備的傳統C API的類。 在一個簡化的例子中,我可能有類似的東西:
class device
{
public:
void set_request(int data) { legacy_set_req(p_device, data); }
int get_response() const { return legacy_get_rsp(p_device); }
private:
device_handle_t *const p_device;
};
這個類本身沒有按位狀態; 因此,我可以選擇將set_request()
聲明為const
,編譯器會對此感到滿意。 但是,從語義的角度來看,這是否是正確的方法,因為它會影響對象的可觀察行為? (即,包封的硬件設備非常確實有狀態)。
我相信const
應該反映邏輯常數,而不管內部表示。 僅僅因為你的對象只包含指向變化的東西的指針,並不意味着所有的成員函數都應該是const
。
C ++甚至具有內部表示的mutable
概念,即使概念上對象沒有,也需要改變。 const
關鍵字顯然不是為了表示“按位”常量。
如果它改變了狀態,一般不應該是const
。 有問題的狀態是遠程擁有的(即,在受控設備中)並不會改變這一點。
一個有用的測試是:
基本上, const
訪問意味着你實際上是一個觀察者。 在這里,如果一些假設的觀察者在時間T2用不同的參數調用set_request()
,那么看起來好像在時間T1處調用set_request(...)
然后在時間T3處調用get_response()
代碼將被嚴重搞砸。 出於這個原因, set_request(...)
不應該是觀察員訪問-它應該是不const
。
(有警告的測試-例如,如果一個const
“觀察者”需要鎖可明顯影響非const
從時序的角度另一個線程的使用,但不應該從功能一個這樣做-但它是很明顯如何進入你的分析的因素)。
與其他類型和成員資格(例如,公共,私有,虛擬)一樣,const表達支持該意圖的意圖和語言語義(即安全特征)。 在這種情況下,即使潛在的語義是安全的,意圖也會顯得違反直覺。 我不會這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.