为什么常量成员函数可以在 C++ 11 中修改对象的可变数据成员?[已关闭]

Why can a const member function modify an object's mutable data member in C++11? [closed]

提问人:yxyc-137 提问时间:5/28/2023 最后编辑:Nelfealyxyc-137 更新时间:5/29/2023 访问量:107

问:


想改进这个问题吗?通过编辑这篇文章来添加详细信息并澄清问题。

6个月前关闭。

成员函数为什么以及如何修改对象的数据成员?constmutable

成员函数使用指针修改对象的数据成员。成员函数的指针是指向常量的指针,而不是普通数据成员。那么,为什么总是可以修改对象标记的数据成员,编译器如何实现它呢?thisthisconstmutable

C++(英语:C++) C++11 可变

评论

0赞 user17732522 5/28/2023
"常量成员函数的 this 指针是指向常量的指针“:从编译器的角度来看,您认为指针和非指针之间的区别是什么?另外,你怎么知道指针实际上指向一个常量?您可以创建指向非常量对象的指针。constconstconstconst
2赞 Paul Sanders 5/28/2023
我不明白反对票。OP 提出了一个完全合理的问题,IMO。
1赞 BoP 5/28/2023
这回答了你的问题吗?“可变”关键字除了允许常量函数修改变量之外,还有其他目的吗?
0赞 Nelfeal 5/29/2023
@BoP 我看不出这个问题与这个问题有什么关系。OP询问的是关键字是如何工作的,而不是它的所有用途。mutable
1赞 Red.Wave 5/30/2023
当详细声明时,成员对象不会继承其拥有的对象const限定;它将保持.mutablemutable

答:

7赞 John Zwinck 5/28/2023 #1

成员变量的全部意义在于它们可以通过实例进行修改。因此,在修改成员变量时,is 这一事实没有相关性,就像在读取成员变量时没有相关性一样。mutableconstthisconstmutable

评论

0赞 yxyc-137 5/28/2023
默认情况下,正则成员函数的 this 指针是指向非常量的 const 指针,而 const 成员函数的 this 指针是指向常量的 const 指针。所以我想知道是不是因为访问可变数据成员的 const 成员函数同时接受指向非常量的 const 指针(访问可变数据成员)和指向常量的 const 指针(访问常规数据成员)?我想知道它是如何工作的
2赞 user17732522 5/28/2023
@yxyc-137 “常量成员函数的这个指针是指向常量的常量指针”:你从哪里得到这个?指针不必指向常量对象:,不是常量对象,而是指向常量对象的指针。事实上,子对象从来都不是常量对象,即使父对象是常量对象。否则,该行为将不起作用。constint i; const int* ptr = &i;iptrconstmutablemutable
2赞 user12002570 5/28/2023
@yxyc-137 不可以,正则成员函数的指针不是常量指针。许多 C++ 教科书错误地表达了你在说什么。(或者你说的是那些书说错了)。正确的语句是非静态非常量成员函数的指针是,而非静态常量成员函数的指针是 。thisthisClass*thisconst X*
3赞 Nelfeal 5/28/2023 #2

编译器如何实现它?

在询问编译器如何处理 之前,您应该询问编译器如何处理 constmutable

顾名思义,它只是另一个与处理方式交互的限定符(或者更确切地说是存储类说明符)。它只是意味着可以修改成员变量,即使声明了包含对象。也可以通过对包含对象的引用(或指针)对其进行修改。它与成员函数没有直接关系。mutableconstmutableconstconst

请注意,成员变量不能通过直接引用(或指针)来修饰。mutableconst

在查看符号的突变操作时,编译器只需根据上述规则检查符号是否可以在此上下文中进行突变。

示例

struct S {
    mutable int i;
};

int main() {
    S const object{0};
    object.i = 1; // ok because object.i is qualified `mutable`, even if object is `const`
    S const& ref = object;
    ref.i = 2; // ok because ref refers to an object that has a `mutable` member `i`

    int const& direct_ref = object.i;
    direct_ref = 3; // error because direct_ref directly refers to a `const` symbol
}

评论

0赞 Gorun 5/28/2023
对这个问题的回答很好。OP 似乎不明白编译过程背后发生了什么,您的链接问题解释了这一点。