2012-08-11 42 views
3

我写了这个代码在C++:const如何使一个函数重载?

class Foo 
{ 
public: 
    int& fun(){return var;}  // 1st fun 
    int fun() const {return var;} // 2rd fun 
private: 
    int var; 
}; 
int main() 
{ 
    Foo foo; 
    int i = foo.fun(); 
    return 0; 
} 

我知道C++不能判定由返回值重载函数,但为什么当我添加了一个常量到2RD功能,超载可以工作? 'const'做了什么?

回答

6

编译器无法通过返回类型进行区分,因为在执行分配之前返回值可能会经历转换。另一方面,调用函数的对象是该函数的参数(尽管是隐式的),因此编译器可以对其进行区分。

+0

我得出这样的结论:函数名称后面的const意味着implict对象(aka。'this')参数是const,所以这两个函数之间的参数实际上是不同的,这会使重载起作用。是真的? – 2012-08-15 01:10:09

+0

@GaryGauh是的,这个结论是正确的。 – dasblinkenlight 2012-08-15 01:14:47

2

const为以下列方式使用:该函数的名称指的是隐式this参数CONST后

Foo inst1; 
const Foo inst2; 

inst1.fun(); // 1st fun 
inst2.fun(); // 2nd fun 

。所以,对于inst1它将会是Foo*和inst2 const Foo*。这将指导超载。

返回值不用于选择过载。具有相同参数集和不同类型返回值的方法/函数不允许在同一图层上。

1

对于它的价值,从标准(§13.3.1/ 3,4)语言:

同样,在适当的时候,上下文可以构造包含隐含的对象 参数的参数列表表示要操作的对象。由于参数和参数在各自列表中的位置相关联,因此惯例是隐式对象参数(如果存在)始终是第一个参数,而隐含对象参数(如果存在)总是第一个参数。

对于非静态成员函数,隐含的对象参数的类型是

- “左值参考CV X”为不具有REF-限定符或与& REF-限定符

声明的函数 - 对于用& & & ref-qualifier 声明的函数的“右值引用cv X”其中X是函数是成员的类,cv是成员函数声明中的cv限定。 [例如:对于X类的const成员函数,额外参数被假定为具有“对const X的引用”类型。 - 结束示例]

相关问题