[英]Const class object with a pointer member
讓我們有一個示例程序:
struct Example
{
int* pointer;
Example(int* p) : pointer(p) {}
};
int main()
{
int var = 30;
const Example object(&var);
object.pointer = &var; // error
*object.pointer = var;
}
我知道為什么會出現錯誤 - 創建 const Example
object 時, pointer
實際上是 const 指針,而不是指向 const 的指針。 因此,當將&var
分配給object.pointer
時,這是不正確的,但將var
分配給*object.pointer
工作得很好。 那么有什么辦法可以使這條線:
*object.pointer = var;
不編譯? 我希望指針指向的值也為 const。 換句話說,當創建一個 const object 時:
const Example object(&var);
我希望 constness 也適用於值本身,而不僅僅是指針:
const int* const pointer; // something like that
要么像這樣聲明數據成員
const int *pointer;
或使其成為受保護或私有數據成員。 在最后一種情況下,您可以聲明一個非常量成員 function 允許更改指針指向的值。 對於 class 的常數 object,不會調用 function。 例如
struct Example
{
private:
int* pointer;
public:
Example(int* p) : pointer(p) {}
int & get_value() { return *pointer; }
const int & get_value() const { return *pointer; }
};
const Example object(&var);
這將創建一個const
object。 一旦創建了const
object ,就無法更改。 根據定義,這就是常數 object 的含義。
object.pointer = &var;
這會嘗試更改此對象的成員。 此 object 無法更改。 現在是常數 object,因此出現錯誤。
我希望 constness 也適用於值本身,而不僅僅是指針:
const int* const pointer; // something like that
“類似的東西”聲明了一個pointer
,它本身就是一個常量值,它指向一個常量值。
如果你想要一個帶有指向const int
的 object ,那就是:
const int *pointer;
無論如何,使 object本身恆定與它完全無關。 它只防止修改 object 本身。 一旦你做了一些const
它就不能以任何理由改變。
你可以做這樣的事情
pointer
成為返回指針的成員 functionstruct Example
{
private:
int* pointer_internal;
public:
Example(int* p) : pointer_internal(p) {}
int*& pointer() { return pointer_internal; }
int* pointer() const { return pointer_internal; }
};
int main()
{
int var = 30;
const Example object(&var);
object.pointer() = &var; // error: lvalue required as left operand of assignment
*object.pointer() = var;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.