2016-11-27 139 views
0

我將回顧重載操作符的基礎知識,特別是賦值操作符。我想了解使用口述副本超載,並按照這個移動的行爲:複製/移動操作的重載賦值操作符?

operator overloading

我覺得他們給相當清楚的例子。

這是迄今爲止我寫的基本代碼來說明重載。如何編輯此代碼以說明在定製複製和移動行爲時使用重載?

class Distance 
{ 
public: 
    int feet, inches; 

    Distance() 
    { 
     feet = 0; 
     inches = 0; 
    } 

    Distance(int f, int i) 
    { 
     feet = f; 
     inches = i; 
    } 

    auto operator=(Distance &D)->void //Use operator to perform additional operation (adding 100) 
    { 
     feet = D.feet + 100; 
     inches = D.inches + 100; 
    } 
}; 

int main() 
{ 
    Distance D1; 
    D1.feet = 10; 
    D1.inches = 12; 
    Distance D2; 
    D2 = D1; 
    std::cout << D2.feet << std::endl; 
} 

回答

-1

您不應該使用這樣的賦值運算符(即使可以)。例如,可以使用賦值運算符和附加操作來計算做出了多少賦值。以這種方式改變數據會導致界面使用過程中的混亂和人爲錯誤。您希望代碼以某種方式工作,在賦值運算符的情況下,它正在複製值。只需按照內置類型的工作方式和以這種方式實現重載操作符。你不會乘以operator +()的體積,對吧?這沒有任何意義。

在這種情況下,其他操作可能是,例如:

static int assignmentCount = 0; 

auto operator=(Distance &D)->void 
    { 
    feet=D.feet; 
    inches=D.inches; 
    std::cout << "Made assignment"; //Just some debug stuff 
    assignmentCount++;    //Count assignments made 
    } 

不要忘了,你已經把有空隙,例如返回類型,它禁止你做以下D1 = D2 = D3,這可能是在某些情況下很有用。返回參考價值是常見的做法。

我推薦閱讀Marc Gregoire的專業C++或者Stroupstrup的書籍之一。我最近的經驗是,在線資源可能會導致某種混亂,書籍通常更適合學習基礎知識。

+1

即使讀完它,它仍然不清楚嗎?或者究竟有什麼擔心嗎? – holmicz

+0

對於那些不明白的人 - OP發表評論指出,Stroupstrup有關於賦值運算符的全部章節,只是爲了說清楚。 – holmicz