day6 深入運算子過載實戰

2021-10-08 12:47:41 字數 3034 閱讀 1831

過載(-> /*)實現auto_ptr

類間的過載

總結

1、c++只可允許過載已有運算子,但不是所有的運算子都可以過載。
可過載運算子

不可過載運算子

只能過載為成員函式的運算子:

2、過載不能改變運算元的個數如`+`是雙目運算子,則必須要有兩個運算元。

3、過載不能改變運算子的結合性如`=`是右結合,過載後還是右結合

4、過載運算子的函式不能有預設的引數 否則就改變了運算子引數的個數。

5、過載運算子的運算中至少有乙個運算元是自定義類。 (不然過載它幹嘛)

6、不應該去改變操作符原來的意義,如把`-`過載為兩個類的加法。是令人頭疼的行為。

如二目運算子過載格式為:

操作符:opr

returntype operator

opr(a,b)

;

根據運用場景確定返回值,與引數,引數個數取決於該運算子屬於幾目運算(特別的,當過載為成員函式時,引數減1,因為可將該類的this指標當成引數)。

#include

using

namespace std;

class

complex;/*

*過載+=

*/complex&

operator+=

(const complex&another)

/* *宣告友元//避免修改

*/friend ostream&

operator

<<

(ostream&out,complex c)

;private

:int _x;

int _y;};

/* *過載輸出運算子

*/ostream&

operator

<<

(ostream&out,complex c)

intmain()

complex& complex::

operator+=

(const complex&another)

ostream&

operator

<<

(ostream&out,complex c)

complex& complex::

operator++(

)

const complex operator++(

int)

1、這裡的引數(int)叫啞元無意義,僅為了區分前++與後++

2、這裡加const是為了讓complex無法進行連續後++(因為普通的後++不能連續,而前++可以)。

class

pow}

;int

main()

下面我自定義乙個類a,建立a的物件,使用自定義的auto_ptr測試

類a

classa~

a()void

func()

};

auto_ptr類

template

<

typename t>

class

auto_ptr

析構函式釋放指標記憶體

~auto_ptr()

t &operator*(

) t *

operator

->()

};

測試

int

main()

結果

可見自動析構了a

注:auto_ptr已經廢棄了,因為指標間共享會導致產生懸浮指標,可採用更為安全的c++11中的智慧型指標,參考c++11 智慧型指標

當操作符的運算元不是同乙個類如:
classa;

classb;

a a;b b;

a opr b

就需要考慮把運算子過載函式定義為誰的成員函式和誰的友元函式。

通常把過載函式定義為左運算元類的成員函式(誰呼叫,則宣告為誰的成員),

並宣告為右運算元類的友元。

1、過載其實乙個特殊的函式,讓我們可以不顯式呼叫該函式,而改用簡單的運算子來呼叫。

如:

c1+

=c2;

c1.operator+=

(c2)

;

這兩種方式是等價的,但直接使用+=更方便。

2、選擇過載為成員函式與全域性函式,(除了個別特殊運算子)其實差別就是多個引數與少個引數的差別。

3、應當尊重操作符基本意義。

深入C 的運算子過載

對於簡單的運算子,可以參考之前的博文。之後會有一篇關於從等號運算子過載的角度研究深淺拷貝的博文。這裡是講 逗號,取成員運算子,輸入輸出運算子,下標運算子,括號,new和delete的過載。逗號運算子過載需要乙個引數,並且返回自身類。逗號運算子在複製操作中比較常見,下面就是以賦值操作為例的逗號運算子過...

深入C 的運算子過載

對於簡單的運算子,可以參考之前的博文。之後會有一篇關於從等號運算子過載的角度研究深淺拷貝的博文。逗號運算子過載需要乙個引數,並且返回自身類。逗號運算子在複製操作中比較常見,下面就是以賦值操作為例的逗號運算子過載。include includeusing namespace std class tem...

深入C 的運算子過載

對於簡單的運算子,可以參考之前的博文。之後會有一篇關於從等號運算子過載的角度研究深淺拷貝的博文。這裡是講 逗號,取成員運算子,輸入輸出運算子,下標運算子,括號,new和delete的過載。逗號運算子過載需要乙個引數,並且返回自身類。逗號運算子在複製操作中比較常見,下面就是以賦值操作為例的逗號運算子過...