簡體   English   中英

如果成員函數影響邏輯狀態,而不是按位狀態,那么它們應該是“const”嗎?

[英]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.

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