C ++ const和具有相同名称的可变函数

时间:2012-09-13 04:21:49

标签: c++ const overloading

考虑以下代码。

#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 ++如何决定调用哪个方法?

4 个答案:

答案 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成员函数,假设额外参数具有类型“对const X的引用”。 ]

因此,如果对象是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,因为obj2const,因此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。