0

让我们有一个示例程序:

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;
}

我知道为什么会出现错误 - 创建 constExample对象时,pointer实际上是 const 指针,而不是指向 const 的指针。因此,当分配&varobject.pointer它时是不正确的,但分配var*object.pointer作品完全没问题。那么有什么办法可以使这条线:

*object.pointer = var;

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

const Example object(&var);

我希望 constness 也适用于值本身,而不仅仅是指针:

const int* const pointer; // something like that
4

3 回答 3

2

要么像这样声明数据成员

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; }
};
于 2021-05-03T12:31:10.330 回答
1

你可以做这样的事情

  • 创建一个返回指针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;
}
于 2021-05-03T12:37:00.040 回答
1
const Example object(&var);

这将创建一个const对象。对象一旦const创建就无法更改。根据定义,这就是常量对象的含义。

object.pointer = &var;

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

我希望 constness 也适用于值本身,而不仅仅是指针:

const int* const pointer; // something like that

"Something like that" 声明 a本身pointer就是一个常量值,并且它指向一个常量值。

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

const int *pointer;

无论如何,使对象本身保持不变与它绝对无关。它只防止修改对象本身。一旦你做了某事const ,它就不能以任何理由改变

于 2021-05-03T12:25:51.603 回答