提问人:yxyc-137 提问时间:5/28/2023 最后编辑:Nelfealyxyc-137 更新时间:5/29/2023 访问量:107
为什么常量成员函数可以在 C++ 11 中修改对象的可变数据成员?[已关闭]
Why can a const member function modify an object's mutable data member in C++11? [closed]
问:
成员函数为什么以及如何修改对象的数据成员?const
mutable
成员函数使用指针修改对象的数据成员。成员函数的指针是指向常量的指针,而不是普通数据成员。那么,为什么总是可以修改对象标记的数据成员,编译器如何实现它呢?this
this
const
mutable
答:
7赞
John Zwinck
5/28/2023
#1
成员变量的全部意义在于它们可以通过实例进行修改。因此,在修改成员变量时,is 这一事实没有相关性,就像在读取成员变量时没有相关性一样。mutable
const
this
const
mutable
评论
0赞
yxyc-137
5/28/2023
默认情况下,正则成员函数的 this 指针是指向非常量的 const 指针,而 const 成员函数的 this 指针是指向常量的 const 指针。所以我想知道是不是因为访问可变数据成员的 const 成员函数同时接受指向非常量的 const 指针(访问可变数据成员)和指向常量的 const 指针(访问常规数据成员)?我想知道它是如何工作的
2赞
user17732522
5/28/2023
@yxyc-137 “常量成员函数的这个指针是指向常量的常量指针”:你从哪里得到这个?指针不必指向常量对象:,不是常量对象,而是指向常量对象的指针。事实上,子对象从来都不是常量对象,即使父对象是常量对象。否则,该行为将不起作用。const
int i; const int* ptr = &i;
i
ptr
const
mutable
mutable
2赞
user12002570
5/28/2023
@yxyc-137 不可以,正则成员函数的指针不是常量指针。许多 C++ 教科书错误地表达了你在说什么。(或者你说的是那些书说错了)。正确的语句是非静态非常量成员函数的指针是,而非静态常量成员函数的指针是 。this
this
Class*
this
const X*
3赞
Nelfeal
5/28/2023
#2
编译器如何实现它?
在询问编译器如何处理 之前,您应该询问编译器如何处理 const
。mutable
顾名思义,它只是另一个与处理方式交互的限定符(或者更确切地说是存储类说明符)。它只是意味着可以修改成员变量,即使声明了包含对象。也可以通过对包含对象的引用(或指针)对其进行修改。它与成员函数没有直接关系。mutable
const
mutable
const
const
请注意,成员变量不能通过直接引用(或指针)来修饰。mutable
const
在查看符号的突变操作时,编译器只需根据上述规则检查符号是否可以在此上下文中进行突变。
示例:
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 似乎不明白编译过程背后发生了什么,您的链接问题解释了这一点。
上一个:如何按顺序执行一系列任务?
评论
const
const
const
const
mutable
mutable
mutable