2017-01-05 30 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而另一個不相同。