Kri*_*Oza 4 c++ const volatile
我无法理解不允许改性剂,如原因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;
}
Run Code Online (Sandbox Code Playgroud)
这将引发编译器错误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将调用成员函数没有任何错误.
Pao*_*o M 10
const 修饰符声明成员函数不会修改函数所属对象的数据成员.
这就像保证在对象上调用该函数aobj 不会修改该对象的内部状态.因此,假设aobj声明const也是如此,您仍然可以在其上调用该函数; 相反,您将无法调用非const功能成员.
如果函数不是类的成员,则应用const修饰符是没有意义的.在另一种语言中,它可能意味着函数无法修改全局变量,也许; 但那种语言不是C++.
想象一下,每个非静态成员函数都有一个隐藏参数:
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):在类定义中编写以声明非静态函数.