2015-04-04 120 views
1

今天我注意到了一些東西。如果我創建三個版本的重載+運算符來處理每一個組合(對象+原始,原始+對象,對象+對象)一切都按預期執行:C++重載我的重載操作符?

class Int 
{ int data; 
    public: 
    Int(){data = 0; }; 
    Int (int size){ data = size; }; 
    friend int operator+(Int, Int); 
    friend int operator+(int, Int); 
    friend int operator+(Int, int); 
}; 
int operator+(Int lInt, Int rInt) 
{ cout <<"first version. "; 
    return rInt.data + lInt.data; 
} 
int operator+(int lInt, Int rInt) 
{ cout <<"second version. "; 
    return rInt.data + lInt; 
} 
int operator+(Int lInt, int rInt) 
{ cout <<"third version. "; 
    return lInt.data + rInt; 
} 
int main(int argc, char *argv[]) { 

    Int int1 = 1; 

    cout << int1 + int1 <<endl; // prints "first version. 2" 
    cout << 3 + int1 << endl; // prints "second version. 4" 
    cout << int1 + 3 << endl; // prints "third version. 4" 
} 

但如果我刪除第二和第三個版本中,它仍作品!?!

class Int 
{ int data; 
    public: 
    Int(){data = 0; }; 
    Int (int size){ data = size; }; 
    friend int operator+(Int, Int); 
}; 
int operator+(Int lInt, Int rInt) 
{ cout <<"first version. "; 
    return rInt.data + lInt.data; 
} 
int main(int argc, char *argv[]) { 

    Int int1 = 1; 

    cout << int1 + int1 <<endl; // prints "first version. 2" 
    cout << 3 + int1 << endl; // prints "first version. 4" 
    cout << int1 + 3 << endl; // prints "first version. 4" 
} 

如何爲我的重載+運營商,這意味着接受兩個對象,能夠採取一個int和對象。它如何能夠採取對象和int?我希望我不會在這裏忽略一些顯而易見的東西!

回答

0

罪魁禍首是這個傢伙:

Int (int size){ data = size; }; 

既然沒有標記explicit,這是一個隱含的構造函數,編譯器會自動推調用它在你有一個int而是一個函數上下文(或運營商)期待Int

因此,舉例來說,編譯器解決

cout << 3 + int1 << endl; 

cout << Int(3) + int1 << endl; 

自動。

使用explicit關鍵字來強制這種類型的代碼更加明確通常是一個好主意,但是,應該指出,隱式構造主要用於非常突出的代碼中,最顯着的是C++標準庫,其中,例如,std::string可以隱含地從const char*構建。這是便利性和清晰度之間的折衷。

+0

也感謝你。現在我明白了! – 2015-04-04 20:14:22

+0

不客氣:) – bgoldst 2015-04-04 20:15:32

0

您已經定義從int的隱式轉換到Int

Int (int size){ data = size; }; 

因此編譯器能弄清楚,Int + int應該叫Int + Int(int)

如果你不想這樣做,無論出於何種原因,你會將構造函數標記爲explicit

+0

AHH!我懂了!但是,如果構造函數沒有返回值std :: cout如何得到答案? – 2015-04-04 20:11:34

+0

@ Jeff-Russ:構造函數的「返回值」是構造對象。並且'<<'的參數是'operator +(Int,Int)'的結果,它的值是一個'int',而不是'Int'。 – rici 2015-04-04 20:12:10

+0

好的,明白了。非常感謝!! – 2015-04-04 20:13:48