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

时间:2015-03-18 07:29:08

标签: 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;
}

会引发error C2270: 'func2' : modifiers not allowed on nonmember functions

的编译器错误void func2( const A& tempObj ) const;

我还在error C2662: 'A::func' : cannot convert 'this' pointer from 'const A' to 'A &' tempObj.func()中收到func2的另一个错误func,我假设会调用成员函数{{1}}而没有任何错误。

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

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

const限定非常有用,因为它明确指出在const变量上调用此方法而不破坏该变量的常量是安全的。