带有指针成员

问题描述

让我们有一个示例程序:

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 对象时,pointer 实际上是 const 指针,而不是指向 const 的指针。因此,将 &var 分配给 object.pointer 是不正确的,但将 var 分配给 *object.pointer 可以正常工作。 那么有什么办法可以使这条线:

*object.pointer = var;

不编译?我希望指针指向的值也是常量。换句话说,当创建一个 const 对象时:

const Example object(&var);

我希望常量也应用于值本身,而不仅仅是指针:

const int* const pointer; // something like that

解决方法

要么像这样声明数据成员

const int *pointer;

或使其成为受保护或私有数据成员。在最后一种情况下,您可以声明一个非常量成员函数,该函数允许更改指针指向的值。对于类的常量对象,不会调用该函数。例如

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 对象。 const 对象一旦创建就无法更改。根据定义,这就是常量对象的含义。

object.pointer = &var;

这会尝试更改此对象的成员。此对象无法更改。它现在是一个常量对象,因此出现错误。

我希望常量也应用于值本身,而不仅仅是应用于 指针:

const int* const pointer; // something like that

“类似的东西”声明了一个pointer,它两者本身就是一个常量值,并且它指向一个常量值。

如果你想要一个指向 const int 的对象,那就是:

const int *pointer;

并且使对象本身保持不变与它完全无关,无论如何。它只防止修改对象本身。一旦你做了一些事情const它不能以任何理由改变

,

你可以这样做

  • 使 pointer 成为返回指针的成员函数
  • 让函数的非常量版本返回对指针的引用以允许对其进行赋值
  • 使用 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;
}