3 回答

TA貢獻1796條經驗 獲得超7個贊
這意味著,*this
是const
該成員函數的內部,即,它不改變的對象。
關鍵字
this
是一個prvalue表達式,其值是調用該函數的對象的地址。類的this
成員函數的類型X
是X*
。如果聲明了成員函數const
,則類型this
為const X*
。[第9.3.2節§1]在
const
成員函數中,通過const
訪問路徑訪問調用函數的對象; 因此,const
成員函數不得修改對象及其非靜態數據成員。[第9.3.2節§2]
這意味著const
可以const
在類的實例上調用成員函數。阿非const
成員函數不能被稱為上[1]一個const
對象,因為它可能嘗試修改它。
[1]注意:臨時不是const
對象,除非它是const
類型。

TA貢獻1719條經驗 獲得超6個贊
const
在函數簽名的末尾意味著函數應該假定它所屬的對象是const
。實際上,它意味著您要求編譯器檢查成員函數是否以任何方式更改對象數據。這意味著要求編譯器檢查它是否不直接更改任何成員數據,并且它不會調用任何本身不保證它不會更改對象的函數。
在創建const
對象時,您要求編譯器確保該對象在初始化之后不會更改。這反過來意味著編譯器將檢查您是否不直接更改其成員數據,并且您不會調用任何不保證它不會更改對象的函數。
這是const正確性哲學的一部分。從本質上講,這意味著如果事情現在正常發揮并且它們不會改變那么它們就永遠不會破裂。換句話說,不斷的事物更容易可靠地工作。const
函數簽名末尾的這個東西是一個禁止破壞事物的工具。這反過來意味著你應該放在const
你可能的任何地方。

TA貢獻1773條經驗 獲得超3個贊
編譯器優化是可能的,但主要的好處是強制執行函數聲明中表示的契約 - 如果將成員函數定義為const
,則編譯器會阻止對該函數內對象的任何修改。
您可以mutable
在聲明中使用此限制來豁免類中的各個字段。這很有用,例如當你有一個封裝了自己的lock_guard的類時,即使在const
成員函數中也必須更改其值以強制執行線程安全。
- 3 回答
- 0 關注
- 635 瀏覽
添加回答
舉報