如何解决类对象的常量性如何影响该类的成员?
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";
}
话虽如此,您应该很少会发现需要使用指向类数据成员的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。