簡體   English   中英

關於C ++常量語法的簡單問題

[英]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的功能的情況下,類型thisWithStatic const *而在const函數,它的類型是const WithStatic * const

就像任何指向const的指針一樣,你不能改變它所指向的任何東西。 因此,您不能更改其任何成員變量,也不能調用其任何非const成員函數。

一般來說,如果你可以合理地將成員函數設為const是個好主意,因為它保證你不會改變對象的狀態,你可以用const對象調用它。

可能的,如果他們的成員變量被改變mutablevolatile ,但這些都是可能最好避免,直到你更熟悉的語言更高級的主題。 當然,你通常不需要擔心它們,除非你需要,否則不應該使用它們。 也可以拋棄this指針的常量,此時你可以改變它,但IIRC,那是未定義的行為,而且它通常被認為是一個壞主意。 因此,有些情況下可以在const成員函數中改變對象的狀態,但通常不可能並且即使它是最好的也可以避免。

當你創建一個成員函數const時,你有效地承諾該函數調用不會改變對象的狀態(盡管顯然可能有副作用,因為你可以調用printf()類的printf() )。

如果成員函數聲明為“const”,則表示該函數不會修改對象的狀態。 這個:

  • 記錄函數不會修改狀態的事實(對其他開發人員有用)。
  • 允許編譯器進行優化,因為知道其他“const”函數的結果不會因調用該函數而改變(允許函數調用從循環中取出)。
  • 當const引用,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.

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