为什么非成员函数不允许使用 const 之类的修饰符

Why modifiers like const not allowed on nonmember functions

我无法理解为什么不允许对非成员函数使用 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;
}

它为 void func2( const A& tempObj ) const;

抛出编译器错误 error C2270: 'func2' : modifiers not allowed on nonmember functions

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

const 修饰符表示成员函数不会修改该函数所属对象的数据成员。

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

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

在 C++ 中,成员函数修饰符适用于调用该函数的 对象。这就是语言对这些修饰符的用途。

非成员函数没有这样的对象,所以限定没有意义。人们可以想象这种允许具有 cv 资格的非成员的语言没有任何效果,但在我看来,这只会让人感到困惑。人们还可以想象 cv 限定符对非成员有不同的含义,但现实就是这样。这就是语言的设计方式。

const 对 class 方法的限定声明该方法不修改任何(非可变)成员变量。

因此在非成员函数上声明它没有任何意义,因为它没有成员变量可以修改。

const 限定非常有用,因为它明确表明可以安全地在 const 变量上调用此方法,而不会破坏该变量的常量性。

假设每个非静态成员函数上都有一个隐藏参数:

int A::func(A* this) {...}

如果您声明一个成员函数 const 或 volatile,它会被添加到该隐藏参数中,非常类似于以下内容:

int A::func(const A* this) {...}

某些语言,如 python 使成员函数的实例参数显式化,因此您可以在 class 定义中编写 def func(self): 来声明非静态函数。