如何在const成员函数中不通过this指针调用非const成员函数?
在const成员函数中不通过this调用非const成员函数的方法
cppreference提到的“不涉及this指针的访问路径”,核心是调用非const成员函数时,不依赖当前const成员函数里的this指针(即当前const对象),而是用其他非const的对象实例作为调用主体。
具体实现方式
要在f2里调用非const的test(),你需要获取一个非const的type对象实例,通过它来调用函数,而非依赖当前const上下文里的this(此时this是const type*类型,无法直接调用非const成员函数)。常见的场景包括:
- 创建临时非const对象调用
- 调用全局/静态存储的非const对象的成员函数
- 通过类内部持有的非const成员指针/引用调用
代码示例修改
针对你的代码,修改f2函数如下(以创建临时对象为例):
void f2(int v) const { // 方式1:创建临时非const对象调用test() type temp_obj; temp_obj.test(); // 方式2:若存在全局非const对象 // extern type global_obj; // global_obj.test(); // 方式3:若类内持有非const成员指针 // 比如struct中添加 type* non_const_ptr; // non_const_ptr->test(); }
为什么之前的尝试失败?
test()和this->test():本质都是用当前const对象的this(const type*)作为调用主体,非const成员函数要求调用对象是type*类型,因此编译报错。type::test():试图将非静态成员函数当作静态函数调用,但非静态成员函数必须依赖对象实例执行,所以编译报错。
关键区别
- 这种“非this路径”和
const_cast的核心差异:const_cast是绕过当前对象的const限定,直接操作当前对象;而前者是操作其他非const对象,不会触碰当前const对象的const属性。 - 如果你的需求是调用当前对象的
test()而非其他对象,那只能用const_cast——因为当前对象在const成员函数中是const限定的,必须转换为非const才能调用它的非const成员函数。
内容的提问来源于stack exchange,提问作者KilluaAoki
相关产品推荐
相关产品推荐

