我在徘徊为什么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
感谢您的见解。
答案 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
版本则需要this
从Foo*
到const Foo*
的资格转换。
答案 1 :(得分:0)
非const对象可以调用特定函数的const和非const版本。而const对象只能调用该函数的const版本。