[英]Simple question about C++ constant syntax
這里有一些代碼復制自Thinking in C ++ Vol1第10章。
#include <iostream>
using namespace std;
int x = 100;
class WithStatic {
static int x;
static int y;
public:
void print() const {
cout << "WithStatic::x = " << x << endl;
cout << "WithStatic::y = " << y << endl;
}
};
const函數print()的含義是什么? 謝謝!
我之前聽說這是“一種不會在邏輯上改變對象的方法”。 這意味着通過調用此方法,調用方可以在方法返回后期望對象的狀態保持不變。 實際上, this
指針成為指向該類的常量實例的常量指針,因此不能更改成員變量。 此規則的例外是成員變量是否聲明為mutable
。 如果類具有mutable
成員變量,則可以通過非const和const方法修改這些變量。 此外,不能從const方法中調用非const方法。
有些人使用mutable
成員變量來緩存及時計算的結果。 理論上,對象的狀態不會改變(即唯一的影響是后續調用更快,但是在給定相同輸入的情況下它們會產生相同的結果)。
這意味着它不會更改類的任何成員變量。
http://www.parashift.com/c++-faq-lite/const-correctness.html
它保證函數根本不會修改對象(即它是“只讀”函數)。 編輯:顯然,該規則的例外是對象是否具有mutable
成員; 那些可以通過const和非const函數來改變。
另外,我很高興看到其他人從TIC ++學習。 這對初學者來說是一個很好的資源。
它的作用是有效地使this
指針成為const的const指針,而不是指向非const的const指針。 因此,任何時候你在const成員函數中引用this
- 顯式或隱式 - 你使用const指針指向const。
所以,在你這里的類,在任何非const的功能的情況下,類型this
是WithStatic const *
而在const函數,它的類型是const WithStatic * const
。
就像任何指向const的指針一樣,你不能改變它所指向的任何東西。 因此,您不能更改其任何成員變量,也不能調用其任何非const成員函數。
一般來說,如果你可以合理地將成員函數設為const是個好主意,因為它保證你不會改變對象的狀態,你可以用const對象調用它。
這是可能的,如果他們的成員變量被改變mutable
或volatile
,但這些都是可能最好避免,直到你更熟悉的語言更高級的主題。 當然,你通常不需要擔心它們,除非你需要,否則不應該使用它們。 也可以拋棄this
指針的常量,此時你可以改變它,但IIRC,那是未定義的行為,而且它通常被認為是一個壞主意。 因此,有些情況下可以在const成員函數中改變對象的狀態,但通常不可能並且即使它是最好的也可以避免。
當你創建一個成員函數const時,你有效地承諾該函數調用不會改變對象的狀態(盡管顯然可能有副作用,因為你可以調用printf()
類的printf()
)。
如果成員函數聲明為“const”,則表示該函數不會修改對象的狀態。 這個:
由於上述所有原因,作為一般經驗法則,如果它不邏輯地修改對象的狀態,則應該將函數聲明為“const”。 如果對象的邏輯狀態發生變化,則不要使用“const”。 順便說一下,有些情況下實際狀態會發生變化,但邏輯狀態卻沒有(例如緩存),在這種情況下,仍然應該將函數標記為“const”,但是需要在緩存中使用“mutable”關鍵字變量,以告訴編譯器修改它們實際上不會改變邏輯狀態。
直觀地說,這意味着該方法不會修改調用它的對象。 但實際上,這意味着兩件事:
const
的對象或對象指針上調用該方法。 this
指針變為const
。 因此,所有成員(聲明為mutable
成員除外)在方法的上下文中是const
,即只讀。 但是,它仍然可以修改:
this
指針訪問的數據 - 包括全局數據,方法參數指向的數據,類的靜態成員,類的其他對象,甚至同一個對象(如果碰巧有訪問非const指針的話)使用const_cast
來繞過或繞過constancy。 const表示不允許print()修改未標記為mutable的狀態變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.