簡體   English   中英

const object 還是 C++ 中的私有/常量數據成員(變量)?

[英]const object or private/const data members (variables) in C++?

我們知道const object 成員一旦聲明就不能修改,但它們的真正用途是什么? 我們可以在 class 中單獨將變量聲明為const或將它們聲明為private

如果C++ 中的 const object有任何其他意義,那么也請提及。

在我看來, const是 C++ 中最基本的科目之一。 經常被忽視的東西。

通常const有三個用例:

  • 允許編譯器更積極地優化
  • 當我們不小心嘗試更改 const 值時,允許編譯器指出我們的錯誤
  • 通過指定我們不希望更改 object 來傳達意圖

對於 class 的 const 成員,我們強制 object 在 class 的實例化期間進行初始化。 防止我們意外更改它在成員函數中的值。 這是僅使用私有成員變量的最大區別。 我們仍然可以在 class 中的任何位置意外更改私有成員變量。

使用 const 最有用的方法之一是使用參數:

  • 由於此答案的 scope 之外的各種原因,這可以允許對編譯器進行重大優化。
  • 對於 const 引用,編譯器可以防止您意外更改該引用的值。
  • 最重要的是,它允許您以更清晰的方式定義 function 的簽名。

我幸運地使用了一次(到目前為止)。 而且我從沒想過我需要在成員變量中使用const

class TypeA {
protected:
    DataX const* m_data;        //get a pointer to a data that shouldn't be modified even inside the class.
public:
    TypeA(DataX const* p){
        m_data = p;
    }
    auto& getData(){ return *m_data; }   //will return DataX const&
}

對於private成員變量,我認為它們最適合當前 class 中的輔助變量,這些變量在邏輯上實際上不屬於 object。 也許是為了緩存,一些應該在一段時間內存在的數據的臨時持有者,算法的計數器等。它們只在當前 class 中使用並且應該使用。 您不希望其他程序員在派生的 class 中使用它們,因為它們有非常特殊的用途,因此您將它們隱藏在private中。

const成員的另一個示例是除enum之外的常量值。 我更喜歡枚舉而不是需要存儲的變量,但是一些程序員更喜歡遵循他們過去的習慣,但是你說服他們不要這樣做(也許我錯了,他們真的是正確的,也許將來由於某種原因const在語言改變了,然后使用const可能會更好。)

class TypeA {
public:
     const int HEY_VALUE = 101;
     const int YOH_VALUE = 102;
     const int HELP_VALUE = 911;
     const float MIN_SOMETHING = 0.01;
     static const int HELLO_EARTH = 10;
     //...

}

我找不到我的這個特定代碼,但我想我使用&而不是const* 我是這樣用的。

class TypeA {
protected:
    DataX& m_data;        
public:
    TypeA(DataX& p):m_data(p){   //you can only set this once in the constructor

    }
    auto& getData(){ return m_data; }   //will return DataX const&
}

我真的更喜歡使用. 而不是->出於個人原因,所以我真的在推動自己實現我想要的語法,我帶來了這些奇怪的解決方案。 這很有趣,因為我發現這些奇怪的方法在 c++ 中仍然有效且可以實現。


更新

如果 C++ 中的 const object 有任何其他意義,也請提及。

也許您可以在const的特定部分設置一些填充字節。

class TypeA {
protected:
     const int HEADER_BYTES = 0x00616263;
     int m_data1;
     int m_data2;
     const uint8_t ANOTHER_FILLER_FOR_SOME_REASON = 0xffffffff; //maybe forcing offset address, or alignment, etc.
     int m_anotherData;
}

從字面上回答你的問題:

如果您創建 class const的成員,則適用於 class 的每個實例,但僅適用於您創建的成員const

如果您制作 object const ,則適用於該 class 的單個實例,但它確實適用於該實例的所有成員。

通常,使用const關鍵字來提高您正在編寫的代碼的可讀性。

但是,在某些情況下, const也可以允許編譯器優化。 讓我們看看下面的代碼片段:

int const i = 1;
fun(&i);
printf("%d\n", i);

在這里,嘗試修改變量i會導致未定義的行為。 因此,編譯器將假設修改甚至不會被嘗試,因此它將值1傳遞給printf function。

同樣適用於 const 數據成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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