過載(-> /*)實現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的過載。逗號運算子過載需要乙個引數,並且返回自身類。逗號運算子在複製操作中比較常見,下面就是以賦值操作為例的逗號運算子過...