为什么在非成员函数上不允许使用const这样的修饰符

Kri*_*Oza 4 c++ const volatile

我无法理解不允许改性剂,如原因constvolatile对非成员函数.

以下是我厌倦的示例代码

class A
{
private:
    int var;
public:
    int func();
};

int A::func()
{
    // Some calculation on using var
    int temp = var + 10;
    return temp;
}

void func2( const A& tempObj ) const;

void func2( const A& tempObj ) 
{
    std::cout << "temp obj called : " << tempObj.func() << std::endl;
}

int main()
{
    A aobj;
    aobj.func();
    func2( aobj );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将引发编译器错误error C2270: 'func2' : modifiers not allowed on nonmember functionsvoid func2( const A& tempObj ) const;

我还得到另一个错误error C2662: 'A::func' : cannot convert 'this' pointer from 'const A' to 'A &',tempObj.func()func2这里我假设func将调用成员函数没有任何错误.

Pao*_*o M 10

const 修饰符声明成员函数不会修改函数所属对象的数据成员.

这就像保证在对象上调用该函数aobj 不会修改该对象的内部状态.因此,假设aobj声明const也是如此,您仍然可以在其上调用该函数; 相反,您将无法调用非const功能成员.

如果函数不是类的成员,则应用const修饰符是没有意义的.在另一种语言中,它可能意味着函数无法修改全局变量,也许; 但那种语言不是C++.


wig*_*igy 5

想象一下,每个非静态成员函数都有一个隐藏参数:

int A::func(A* this) {...}
Run Code Online (Sandbox Code Playgroud)

如果声明成员函数const或volatile,则将其添加到该隐藏参数,非常类似于以下内容:

int A::func(const A* this) {...}
Run Code Online (Sandbox Code Playgroud)

像python这样的语言使成员函数上的实例参数显式化,因此您def func(self):在类定义中编写以声明非静态函数.