簡體   English   中英

const class object 帶指針成員

[英]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成為返回指針的成員 function
  • 具有 function 的非常量版本返回對指針的引用以允許分配給該指針
  • 讓 function 的 const 版本返回指針的副本以防止分配
struct 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.

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