<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 一.總則 1. 對于類類型,重載運算符一般使用 **引用** 作為參數,來避免不必要的復制。 2. 為了增加對 **常對象** 的支持,建議將 類類型參數 設置為 **常引用** ,對于在類內重載的運算符,可以將該函數設置為 **常成員函數** 。 3. 返回值不一定是 **引用** ,更不能是局部變量的引用(除了 **引用參數** )。 ## 二.重載算術運算符(位運算符類似) 1. 算術運算符的操作細節:將計算結果放入新的對象,并返回。 **注意不要返回引用。** 2. 一般將雙目算術運算符重載為友元或普通函數,將單目算術運算符重載為成員函數。 3. 一般情況下,算術運算符中 `+` 和 `*` 需要滿足不同類型之間的交換律。為了滿足這個需求,一般需要: + 重載為友元或普通函數。因為將這些運算符重載為普通函數,要求第一個操作數必須是該類的對象。 + 添加 **轉換構造函數** ,使得其他類型的數據可以轉換到該類。 ```c++ //重載示例 T1 operator+(const T1&,const T2&); T1 operator+(const T2&,const T1&); //如果你的類有轉換構造函數,可以把T2 轉換成 T1,也可以這么寫: T1 operator+(const T1&,const T1&); ``` 4. 注意除法和取余中,第二個操作數為 `0` 的情況。 ## 二.重載賦值運算符 1. 為滿足 **鏈式調用** 的需求,應該設置返回值為第一個操作對象的引用。 2. 只能將該運算符重載為成員函數。 3. 一般不需要定義常成員函數版本。你會對一個常量賦值嘛? ```c++ //鏈式調用 a=b=c=d=e; //拷貝賦值運算符重載示例 T& T::operator=(const T&); //[11+][$]移動賦值運算符重載示例 T& T::operator=(const T&&); ``` ## 三.重載復合賦值運算符 1. 復合賦值運算符的操作細節:將計算結果放入第一個運算對象,并返回 **其引用** 。 2. 一般將復合賦值運算符重載為成員函數。 3. 注意除法和取余中,第二個操作數為 `0` 的情況。 4. 一般不需要定義常成員函數版本。你會對一個常量賦值嘛? ```c++ //鏈式調用 a+=b; //重載示例 T& T::operator+=(const T2&); ``` ## 四.重載關系運算符 1. 因為這些運算符功能幾乎差不多,因此可以先寫一個專用函數用于比大小。 例如,大于返回1,等于返回0,小于返回 -1。 然后這些重載函數的內容基本上就是一句話的事。 2. 返回值應該為 `bool` 。 ```c++ int T::compare(const T&) const; bool operator>(const T& t1,const T& t2) { return t1.compare(t2) > 0; } bool operator<(const T& t1,const T& t2) { return t1.compare(t2) < 0; } bool operator==(const T& t1,const T& t2) { return t1.compare(t2) == 0; } ``` ## 五.重載前置遞增遞減運算符 1. 一般類內重載前置遞增遞減運算符,不需要偽參數。 2. **需要返回遞增后自身的引用** 。 3. 一般不需要定義常成員函數版本。你會對一個常量遞增遞減嘛? ```c++ //重載 T& T::operator++(); T& T::operator--(); //調用 T i; ++i; --i; ``` ## 六.重載后置遞增遞減運算符 1. 一般類內重載后置遞增遞減運算符。 2. 為了區分前置遞增遞減運算符,需要加上一個 **偽參數** 。 3. **需要返回遞增遞減前的自身** 。 4. 一般不需要定義常成員函數版本。你會對一個常量遞增遞減嘛? ```c++ //返回遞增遞減前的自身對象 T T::operator++(int); T T::operator--(int); //調用 T i; i++; i--; ``` ## 七.重載數組下標運算符 1. 只能重載為成員函數。 2. 可以通過賦值語句來修改運算結果并影響到對象自身,因此需要返回 **引用** 。 3. 注意檢查下標范圍。 ```c++ T& T::operator[](int); const T& T::operator[](int) const; ``` ## 八.重載解引用運算符 1. 運算結果為一個 **左值** ,因此需要返回引用。 ```c++ T& T::operator*(); const T& T::operator*() const; ``` ## 九.重載指針的成員運算符 1. 該運算符非常特殊,雖然它是雙目運算符,但它的重載函數 **沒有參數**。 2. 返回值為一個可以進行 **指針的成員訪問** 的指針。 3. 必須在類內重載。 ```c++ //注: T1* 可以進行 `->` 操作 T1* T::operator->(); const T1* T::operator->() const; //相當于: t1.operator->()->t2; t1->t2; ``` ## 十.重載函數調用運算符 1. 效果:可以像函數一樣使用對象。 2. 只能在類內重載。 ```c++ int T::operator()(int i,double d); ``` ## 十一.重載插入和提取運算符 只能在類外重載。 ```c++ ostream& operator<<(ostream& os,const T& obj); istream& operator>>(istream& is,T& obj); ``` ## 十二.罕見的運算符重載 1. `&(取地址)` 沒有必要重載,因為它可以作用于任何類型的左值,表示取地址。 2. `,(逗號)` 可能會改變運算符本身的求值順序。重載有負作用。 3. **邏輯運算符** 會失去其短路求值的特性。考慮到其負作用,一般使用類類型到 `bool` 的類型轉換來代替邏輯運算符的重載。 4. `->*(指針的成員指針)` 。沒有什么問題,但很少有類使用它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看