我无法理解不允许const
或volatile
等修饰符用于非成员函数的原因。
以下是我累了的示例代码
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}}而没有任何错误。
答案 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
变量上调用此方法而不破坏该变量的常量是安全的。