为什么从常量函数c++的主体中调用非常量函数

Why calling non const function from in body of const function c++?

本文关键字:函数 常量 调用 非常 主体 c++ 为什么      更新时间:2023-10-16

考虑以下代码,在这种情况下输出为:

f非常数
g常量

这有点令人困惑,因为someClass正在从其常量函数中为常量数据成员调用非常量函数

#include <iostream>
using namespace std;
class Inner
{
public:
    void f() const { cout<< "f const" <<endl; }
    void f() { cout<< "f non const" <<endl; }
};
class someClass
{
    Inner * const obj2;
public:
    someClass():obj2(){}
    void g() {obj2->f(); cout<< "g non const" <<endl; }
    void g() const {obj2->f(); cout<< "g const" <<endl; }
};
int main()
{
    const someClass a;
    a.g();
}

为什么someClass在这种情况下调用非常量函数?

我想您在问为什么调用void Inner::f()。这是因为您有一个指向非常量Inner:的const指针

Inner * const obj2;

如果你想要一个指向const Inner的指针,那么你需要

const Inner * obj2;

Inner const * obj2;

如果你想要一个指向const内部的const指针,

const Inner * const obj2;

我会让你想出另一个选择。

答案如下:

类someClass中的obj2是Inner*const的类型,这意味着指针是const,而不是数据本身,因此它调用的是一个非常量函数。

为了获得预期的输出,obj2必须以这种方式声明:

Inner const * obj2;