Const方法重载

时间:2014-11-10 08:39:24

标签: c++ overloading

我在徘徊为什么C ++选择在非const对象上调用非const方法,因为重载方法的区别仅在于const方法签名,即:

#include<iostream>

class Foo
{
 public:
  Foo() {}
  int bar() const { std::cout<<"const version called"<<std::endl; }
  int bar() { std::cout<<"version called"<<std::endl; }
};

int main()
{
  Foo f;
  f.bar();
  const Foo g;
  g.bar();
  return 0;
}

我理解对于g对象,是const,调用bar的const版本。但是怎么样?输出是

version called
const version called

感谢您的见解。

2 个答案:

答案 0 :(得分:5)

这就是重载解析的工作原理。

首先,构建候选函数列表。在您的情况下,它包含两个功能:

int Foo::bar() const;
int Foo::bar();

列表中的每个函数都转换为接受this参数,大致如下:

int Foo_bar(const Foo* this);
int Foo_bar(Foo* this);

然后根据C ++标准的“最佳可行功能”(13.3.3)部分进行选择,简而言之,最佳功能是需要最少转换次数的功能。参数。因此,如果您有Foo f;并致电f.bar(),那么最好的功能是接受非const this的功能,因为它不需要转换,而const版本则需要thisFoo*const Foo*的资格转换。

答案 1 :(得分:0)

非const对象可以调用特定函数的const和非const版本。而const对象只能调用该函数的const版本。