2017-01-05 29 views
2

请考虑以下代码。C++函数重载中的意外行为

class MyClass1 
{ 
public: 
    MyClass1(const int& i) 
    { 
    myVar = i; 
    } 

    const int& get() const 
    { 
    std::cout<<"Inside 1 \n"; 
    return myVar; 
    } 

    int get() 
    { 
    std::cout<<"Inside 2 \n"; 
    return myVar; 
    } 

private: 
    int myVar; 
}; 

class MyClass2 
{ 
public: 
    MyClass2(const int& i) 
    { 
    myVar = i; 
    } 

    const int& get() 
    { 
    std::cout<<"Inside 3 \n"; 
    return myVar; 
    } 

    int get() const 
    { 
    std::cout<<"Inside 4 \n"; 
    return myVar; 
    } 

private: 
    int myVar; 
}; 


int main(int argc, char* argv[]) 
{ 

    MyClass1 myClass1(10); 
    int tmp1 = myClass1.get(); 
    const int& tmp2 = myClass1.get(); 


    MyClass2 myClass2(10); 
    int tmp3 = myClass2.get(); 
    const int& tmp4 = myClass2.get(); 

    return 0; 
} 

输出显示如下。

Inside 2 
Inside 2 
Inside 3 
Inside 3 

对于 “const int的& TMP2 = myClass1.get();”我预计它会在MyClass1中打印调用“const int & get()const”。令我惊讶的是,它在MyClass1中的两种情况下都称为“int get()”。 在MyClass2中,我调换了“const”,然后我发现在函数调用中它调用了“const int & get()”。 这是怎么发生的?

+0

C++根据返回类型重载的唯一方法是重载转换运算符... –

+2

@ W.F。 - 它是一个**转换**运算符,而不是**演员**操作符。没有演员就可以完成转换。 –

+0

@PeteBecker你是对的措辞不是我的好方... –

回答

5

对于“const int & tmp2 = myClass1.get();”我预计它会在MyClass1中打印调用“const int & get()const”。

你不解释你为什么期待这一点,但你肯定不应该这样做。有两个get函数不带参数,一个const,另一个不带。由于myClass1不是const,因此调用不是const的函数。

如果不是这种方式,那么允许具有相同名称并采用相同参数的两个类成员函数的区别仅在于const而另一个不相同。