类对象的常量性如何影响该类的成员?

问题描述

AFAIK 类类型的 const 对象导致其所有成员也是 const。并且指向普通对象的指针不能指向 const 对象。

在这个例子中,我试图理解指向类成员的指针:

struct Foo{
    int value_ = 1024;
};

int main(){

    int Foo::* ptr = &Foo::value_; // ptr is a pointer to any non-const non-static integer member data
    Foo f;
    ++(f.*ptr);// ok

    Foo const cf;
    // ++(cf.*ptr); // error. OK
    std::cout << cf.*ptr << '\n';

    std::cout << "\ndone!\n";
}

如您所见,ptr 是指向 Foo 类型的类 int 的非静态非常量成员数据的指针,这意味着它不能指向 {{1 }} 整数成员数据。

  • const 是类 cf 类型的 const 对象,我们知道常量对象的成员本身就是常量,所以为什么允许这样做:

    Foo
  • std::cout << cf.*ptr << '\n'; // why allowed? cf 现在是常量,因为 value_cf 所以为什么允许将指针 const 绑定到该常量会员资料?

解决方法

指向类成员的指针是很少使用的特性,与普通指针非常不同。

  • 他们只持有类内成员的偏移量
  • 您不能像使用普通指针那样增加或减少指针本身

我看待这些指针的方式是,如果它们碰巧是公共成员,它们只是创建一个新名称或访问类成员的新方法。

通过指向 const 对象成员的指针,编译器知道它当前指向的是 const 对象的成员。 并且你会没事的,只要你只访问数据成员而不修改它。

如下修改您的情况,其中数据元素本身是一个常量,在这种情况下,您也可以读取数据成员,但编译器不允许您更改数据成员。 另外,请注意,您需要将类成员指针声明为指向 const int。

struct Foo
{
    const int value_ = 1024;
};

int main()
{
    const int Foo::* ptr = &Foo::value_;
    Foo f;
    //++(f.*ptr);// Error
    std::cout << f.*ptr << '\n';  //OK,works

    Foo const cf;
    // ++(cf.*ptr); // error. OK
    std::cout << cf.*ptr << '\n';

    std::cout << "\ndone!\n";
}

话虽如此,您应该很少会发现需要使用指向类数据成员的指针。