Ven*_*tta 4 c++ overloading const
考虑以下一段代码.
#include <iostream>
using namespace std;
class Object
{
public:
Object() {}
void Print() const
{
cout << "const" << endl;
}
void Print()
{
cout << "mutable" << endl;
}
};
void print_obj(const Object& obj)
{
obj.Print();
}
int main()
{
Object obj1;
const Object obj2;
Object*const pobj1 = &obj1;
print_obj(obj1);
print_obj(obj2);
obj1.Print();
obj2.Print();
pobj1->Print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
const
const
mutable
const
mutable
Run Code Online (Sandbox Code Playgroud)
我想知道,当面对许多具有相同名称的可变方法时,C++如何决定调用哪个方法?
print_obj(obj1);
print_obj(obj2);
Run Code Online (Sandbox Code Playgroud)
要调用的函数是根据传递的对象的cv-qualifier(const/ volatile)来计算的.请注意,在函数重载决策时会考虑使用cv限定符.
如果传递的对象是const,const则选择函数接收参数.如果传递的对象是非const,则选择接收非const参数的函数.
obj1.Print();
obj2.Print();
pobj1->Print();
Run Code Online (Sandbox Code Playgroud)
如果对象是const那么只能调用const成员函数.
如果对象是非const,那么非const版本将在版本上受到限制const.
标准明确规定了规则.
参考:
C++ 03标准:
§13.3.1候选函数和参数列表:
对于非静态成员函数,隐式对象参数的类型是"引用到cv
X",X其中函数是其成员的类,cv是成员函数声明的cv-qualification.[示例:对于类的const成员函数,X假设额外参数具有类型"const to referenceX".]
因此,如果对象是const编译器将选择成员函数的版本,该函数具有对constObject的类型引用的隐式对象参数,这是const版本的Print().