【问题标题】:How the const-ness of a class object affects members of that class?类对象的常量如何影响该类的成员?
【发布时间】:2021-09-18 10:58:52
【问题描述】:

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

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

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

【问题讨论】:

  • 这是对类属性的引用,为什么 const 应该关心?你只是对编译器说get the attribute with this offset
  • @AlbertoSinigaglia:但是如果你尝试修改它,它会编译失败:++(cf.*ptr); 产生错误。
  • 是的,因为您正在尝试编辑一个 const 字段......事情应该像这样工作:(1)你好,这是我的对象(2)请转到这个偏移量 [@987654341 @] (3) 做你必须做的事……在 (3) 编译器检查你是否能做你想做的事
  • 允许绑定,不允许变异 - "...cv 限定规则与对象运算符的成员相同,但有一个附加规则:指向该成员的指针引用可变成员不能用于修改 const 对象中的该成员;..." en.cppreference.com/w/cpp/language/operator_member_access
  • @RichardCritten:非常感谢!

标签: c++ pointers constants


【解决方案1】:

指向类成员的指针很少使用,与普通指针有很大不同。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2021-09-10
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多