賦值運算子過載引數問題

2021-10-02 18:35:02 字數 698 閱讀 7641

賦值運算子的過載,應該使用這種方式:

boy& operator=(const boy &boy);

就是:引數要使用引用!

如果定義成:

boy& operator=(const boy *boy);

將會沒有效果,編譯器不會識別為賦值運算子的過載,也就是:

boy2 = boy1時不會呼叫這個函式

編譯器會生成乙個賦值建構函式,然後執行淺拷貝。

如果定義:

boy& operator=(const boy boy);

有效果,但是在呼叫時,會執行引數的傳遞:

比如:boy2 = boy1;

就會執行:boy2.operator=(boy1);

就會執行: const boy boy = boy1;

就會執行: boy類的賦值建構函式

有兩個影響:

1)浪費效能

2)如果沒有自定義的拷貝建構函式,而且這個類又有指標成員時,就會呼叫自動生成的拷貝建構函式,導致淺拷貝如果析構函式中,對這個指標指向的記憶體做了釋放,那就導致資料損壞或崩潰!

小結:

1)賦值運算子的過載,一定要使用引用引數

2)如果乙個類有指標成員,而且使用了動態記憶體分配,那麼一定要定義自己的拷貝建構函式【要使用深拷貝】,避免呼叫自動生成的拷貝建構函式 因為自動生成的拷貝建構函式,是淺拷貝!

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

過載賦值運算子

1 注意過載賦值運算子和,運算子必須定義為類的成員函式。2 注意 如果程式不提供顯示的賦值運算子則系統會提供乙個預設的賦值運算子。3 什麼時候過載賦值運算子 當類中含有指標成員時,一般都要重定義類的賦值運算子。4 過載賦值運算子時應有處理語句m m的情況。其中m是某乙個類的物件。如果不處理這樣的語句...

賦值運算子過載

在下面類中實現 class cmystring 為了寫出乙個完整的賦值運算子過載函式,我們要考慮以下幾個問題 一步步解決上述的問題,我們可以編寫出經典的演算法 cmystring cmystring operator const cmystring str return this 考慮到異常安全性的...