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



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是指向int类型的类Foo的非静态非常量成员数据的指针,这意味着它不能指向const整数成员数据。

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

    std::cout << cf.*ptr << 'n'; // why allowed?
    
  • cfvalue_现在是常量,因为cfconst,那么为什么允许它将指针ptr绑定到该常量成员数据?

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

  • 它们只保留类中成员的偏移量
  • 不能像使用普通指针那样递增或递减指针本身

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

使用指向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";
}

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

最新更新