[英]const object or private/const data members (variables) in C++?
我們知道const
object 成員一旦聲明就不能修改,但它們的真正用途是什么? 我們可以在 class 中單獨將變量聲明為const
或將它們聲明為private
。
如果C++ 中的 const object有任何其他意義,那么也請提及。
在我看來, const
是 C++ 中最基本的科目之一。 經常被忽視的東西。
通常const
有三個用例:
對於 class 的 const 成員,我們強制 object 在 class 的實例化期間進行初始化。 防止我們意外更改它在成員函數中的值。 這是僅使用私有成員變量的最大區別。 我們仍然可以在 class 中的任何位置意外更改私有成員變量。
使用 const 最有用的方法之一是使用參數:
我幸運地使用了一次(到目前為止)。 而且我從沒想過我需要在成員變量中使用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.