2014-07-21 79 views
0

我curently學習有關運算符重載,我發現這個例子:操作符重載例如不明確

#include <iostream> 
using namespace std; 

class MinMax 
{ 
private: 
    int m_nMin; // The min value seen so far 
    int m_nMax; // The max value seen so far 

public: 
    MinMax(int nMin, int nMax) 
    { 
     m_nMin = nMin; 
     m_nMax = nMax; 
    } 

    int GetMin() { return m_nMin; } 
    int GetMax() { return m_nMax; } 

    friend MinMax operator+(const MinMax &cM1, const MinMax &cM2); 
    friend MinMax operator+(const MinMax &cM, int nValue); 
    friend MinMax operator+(int nValue, const MinMax &cM); 
}; 

MinMax operator+(const MinMax &cM1, const MinMax &cM2) 
{ 
    // Get the minimum value seen in cM1 and cM2 
    int nMin = cM1.m_nMin < cM2.m_nMin ? cM1.m_nMin : cM2.m_nMin; 

    // Get the maximum value seen in cM1 and cM2 
    int nMax = cM1.m_nMax > cM2.m_nMax ? cM1.m_nMax : cM2.m_nMax; 

    return MinMax(nMin, nMax); 
} 

MinMax operator+(const MinMax &cM, int nValue) 
{ 
    // Get the minimum value seen in cM and nValue 
    int nMin = cM.m_nMin < nValue ? cM.m_nMin : nValue; 

    // Get the maximum value seen in cM and nValue 
    int nMax = cM.m_nMax > nValue ? cM.m_nMax : nValue; 

    return MinMax(nMin, nMax); 
} 

MinMax operator+(int nValue, const MinMax &cM) 
{ 
    // call operator+(MinMax, nValue) 
    return (cM + nValue); 
} 

int main() 
{ 
    MinMax cM1(10, 15); 
    MinMax cM2(8, 11); 
    MinMax cM3(3, 12); 

    MinMax cMFinal = cM1 + cM2 + 5 + 8 + cM3 + 16; 

    cout << "Result: (" << cMFinal.GetMin() << ", " << 
     cMFinal.GetMax() << ")" << endl; 

    return 0; 
} 

我不明白怎麼做行MinMax cMFinal = cM1 + cM2 + 5 + 8 + cM3 + 16;工作。

當計算它時,它變成MinMax cMFinal = MinMax(3, 16)。接下來發生了什麼?當我沒有定義重載分配操作符時,編譯器如何將一個對象分配給另一個對象?

回答

3

假設你有兩個MinMax對象,ab。然後,當你有這樣一行

MinMax c = a + b; 

那麼編譯器將其轉換爲以下

MinMax c = operator+(a, b); 

換言之,它就像一個正常的函數調用。

如果你做多的操作,如

MinMax d = a + b + c; 

那麼編譯器就會在內部生成的臨時變量和使用,就像

MinMax compilerGeneratedTemporary = operator+(a, b); 

MinMax d = operator+(compilerGeneratedTemporary, c); 

如果它是初始化你想知道大約,那麼它就叫MinMax複製構造函數。當你同時聲明和初始化一個對象變量時,它不是一個賦值,它只是重用賦值操作符。

operator+函數返回一個MinMax對象,該對象被傳遞給類複製構造函數。

如果某個類沒有複製構造函數,編譯器會自動爲您生成一個(除少數例外,請參閱下面鏈接的參考)。

Read more about the copy-constructor here

+0

複製elison會發生在這裏,不是嗎?如果它不會移動構造函數而不是複製構造函數? – 0x499602D2

+0

@ 0x499602D2是會發生copy-elision,但我會將其另存爲另一個問題(當OP詢問爲什麼他/她自己的複製構造函數未被調用時)。 :) –