考虑以下代码。
#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;
}
输出
const
const
mutable
const
mutable
我想知道,当面对许多具有相同名称的可变方法时,C ++如何决定调用哪个方法?
答案 0 :(得分:7)
print_obj(obj1);
print_obj(obj2);
要调用的函数是根据传递的对象的 cv-qualifier (const
/ volatile
)进行评估的。请注意,在函数重载决策时会考虑 cv-qualifiers
如果传递的对象是const
,则选择函数接收const
参数。如果传递的对象是非const,则选择接收非const参数的函数。
obj1.Print();
obj2.Print();
pobj1->Print();
如果对象为const
,则只能调用const
成员函数
如果对象是非const,那么非const版本将在const
版本上进行预先设置。
标准明确规定了规则。
参考:
C ++ 03标准:
§13.3.1候选函数和参数列表:
对于非静态成员函数,隐式对象参数的类型是“引用cv
X
”,其中X
是函数所属的类,cv是cv-成员函数声明的资格。 [示例:对于类X
的const成员函数,假设额外参数具有类型“对constX
的引用”。 ]
因此,如果对象是const
,编译器将选择成员函数的版本,该函数具有类型为的const Object
类型的隐式对象参数,它是{{1}的const版本}}
答案 1 :(得分:1)
所有函数重载的工作方式都相同。
在考虑重载的成员函数时,它包含隐式this
参数。如果函数声明为const
,则this
参数为const Object *
。如果该函数不是const
,则this
参数为Object *
。由于const
限定符会影响函数重载规则,这意味着函数的const
也会影响函数重载规则。
在您的具体示例中,print_obj(obj1)
打印const
,因为print_obj()
被声明为const Object&
,这意味着它将始终调用const
版本Print()
。与print_obj(obj2)
相同。
obj1.Print()
打印mutable
因为obj1
不是const
,因此const
的非Print()
版本是更好的匹配,是选择功能重载决议。
obj2.Print()
打印const
,因为obj2
是const
,因此const
Print()
版本的pobj1->Print()
是唯一合适的函数重载。< / p>
mutable
打印*pboj1
,因为const
是非const
值,因此非Print()
版本的void Print(Object &obj);
void Print(const Object &obj);
被选中功能重载决议。
考虑它的最简单方法是,如果你只是
会发生什么{{1}}
答案 2 :(得分:1)
请注意,对于普通对象,如果非const
版本可用,则选择非const
版本;否则选择const
版本。以下是分析:
print_obj(obj1); // print_obj() receives const argument, so `const` is chosen
print_obj(obj2); // same as above
obj1.Print(); // obj1 is not const, so non-const version is chosen
obj2.Print(); // obj2 is const, so must choose const version
pobj1->Print(); // pobj1 is a const pointer pointing to non-const object, so non-const version is chosen
答案 3 :(得分:-2)
如果两者都这样做,那么首选const方法为非const。
同样适用于易失性,BTW。