为什么非成员函数不允许使用 const 之类的修饰符
Why modifiers like const not allowed on nonmember functions
我无法理解为什么不允许对非成员函数使用 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;
}
它为 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):
来声明非静态函数。
我无法理解为什么不允许对非成员函数使用 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;
}
它为 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):
来声明非静态函数。