C++ const成员函数操作普通与指针成员的const正确性疑问
这是C++的标准预期特性,和编译参数无关,核心区别是const成员函数对不同类型成员的约束规则不同:
- 被
const修饰的成员函数中,当前对象的this指针是const B*类型,函数内不能修改当前对象的任何非mutable成员,也不能调用当前对象的非const成员函数。
第一种情况:成员为A类型实例
当B的成员是A t;时,t是B对象本身的组成部分。在const修饰的funcB中,整个B对象被视为常量,它的所有成员也都自带const属性,此时t的实际类型是const A。调用非const的funcA时,相当于把const A类型的指针传给funcA需要的非const的this参数,自然会触发「丢弃限定符」的编译报错。
第二种情况:成员为A*类型指针
当B的成员是A* t;时,t作为指针本身才是B对象的组成部分。const修饰的funcB只会约束指针本身的值不能被修改(也就是不能在funcB里让t指向其他地址),不会约束t指向的内存的常量属性。此时t的类型是A* const(指针本身是常量,指向的内容不是常量),调用t->funcA()时传入的this指针是普通的A*,完全匹配非const的funcA的参数要求,所以可以正常编译。
注意:该写法仅语法合法,你需要自行保证
t指向的内存有效,避免野指针问题。
内容的提问来源于stack exchange,提问作者user8458838
相关产品推荐
相关产品推荐

