什麼是操作符函式:在c++中針對類型別的物件的運算子,由於它們肯定不支援真正的運算操作,因此編譯器會將它們翻譯成函式,這種就叫做操作符函式(運算子函式)
編譯器把運算子編譯成運算子函式,可以針對自定義的類型別設計它獨有的運算功能
其實各種運算子已經基本一些功能,再次實現它就是叫作運算子過載
雙目運算子:
a+b成員函式
a.operator
+(b)
; 全域性變數
operator
+(a,b)
; 單目運算子:
!a 成員函式
a.operator!(
void);
全域性函式
operator
!(a)
;
成員函式:
const 類物件 operator #(
const 類)
const
注意:雙目運算子的運算結果是個右值,返回值應該加 const
,然後為了const物件能夠呼叫引數應寫 const
,函式也應該具備const屬性
全域性函式:
const 類 operator#(
const 類& a,
const 類& b)
注意:全域性函式不是成員函式,可能會訪問類的私有成員,解決這個問題可以把函式宣告為類的友元函式(友元沒有this指標,不是成員)
友元:在類的外部某個函式中想訪問類的私有成員(public/protected/private)時,需要所在的函式宣告為友元,友元只是朋友,因此它只有訪問權,沒有實際的擁有權(其根本原因是它沒有this指標)
友元宣告:把函式的宣告寫乙份到類中,然後在宣告前加上 friend 關鍵字
注意:友元函式與成員函式不會構成過載關係,因為它們不在乙個作用域,使用友元既可以把操作符定義為全域性的,也可以確保類的封裝性
成員函式
類&operator#(
void)
全域性函式
類&operator#(
const 類& that)
1.獲取單參構造成賦值運算的呼叫方式
string str=
"sunll"
;//會呼叫單參構造,而不呼叫賦值構造
2.左運算元據不能具有const屬性
1.成員函式不能是常函式
2.全域性函式第乙個引數不能有const屬性
四.單目操作符函式過載
成員函式
const 類&
operator#(
void
)const
全域性函式
const 類&
operator#(
const 類& that)
前++/--
類&operator#(
void
) 類&
operator#(類& that)
後++/--
(啞元)
const 類&
operator#(
int)
const 類&
operator#(類& that,
int)
五.輸入輸出操作符過載
cout 是ostream型別的物件,cin是istream型別的物件
如果<>運算實現位運算函式,那麼呼叫者應該是ostream/istream,而我們無權增加標準庫的**,因此輸入/刪除運算子只能定義為全域性函式
ostream& operator<<(ostream& os,const 類&p)
istream& operator<<(istream& is,const 類&p)
注意:在輸入輸出過程中,cin/cout會記錄錯誤標誌,因此不能加const屬性
六.特殊操作符的過載
1.下標操作符[ ],常用於在容器型別中以下標獲取元素
型別&
operator
(int i)
2.函式操作符(),乙個類如果過載函式操作符,那麼它的物件就可以像函式一樣使用,引數的個數,返回值類,可以不確定,
它是唯一乙個可以引數有預設引數的操作符
3.解引用操作符 ,成員訪問操作符->
如果乙個類過載了 * 和->,那麼它的物件就可以向指標一樣使用
所謂的智慧型指標就是一種類物件,它支援解引用和成員訪問操作符
4.智慧型指標
常規指標的缺點:
當乙個常規指標離開它的作用域時,只有該指標所佔的空間會被釋放,而它指向的記憶體空間能否被釋放就不一定了,
在一些特殊情況(人為,業務邏輯特殊)free或delete沒有執行,就會形成記憶體洩露
智慧型指標的優點:
智慧型指標是乙個封裝了常規指標的類型別物件,當它離開作用域時,它的析構函式就會自動執行,
他的析構函式會負責釋放常規指標所指向的動態記憶體(以正確方式建立的智慧型指標,它的析構函式才會正確執行)
智慧型指標和常規指標的相同點:都支援*和->運算
智慧型指標和常規指標的不同點:
任何時候,乙個物件只能使用乙個智慧型指標來指向,而常規指標可以指向多次
智慧型指標的賦值操作需要通過拷貝構造和賦值構造特殊處理(深拷貝)
auto_ptr:標準庫中封裝號的智慧型指標,實現了常規指標的基本功能,
標頭檔案 #include
用法:auto_ptr《指向的型別》指標變數名(物件的位址)
auto_ptr的侷限性:
不能跨作用域使用,一旦離開作用域指標變數會釋放它指向的物件也會釋放
不能放入標準容器
不能指向物件資料
5.new/delete/new/delete 運算子
1.c++中預設的動態記憶體管理器速度較慢,過載new/delete底層使用malloc/free可以提高執行速度
2.new 在失敗時會產生異常,而每次使用new時為了安全都應該進行異常捕獲,而過載new操作符只需要在操作符函式中進行一次錯誤處理即可
3.在一些佔位元組數比較小的類,頻繁使用new,可能會產生大量的記憶體碎片, 而過載new操作符後,可以適當的擴大每次申請的位元組數,減少記憶體碎片產生的機率
4.過載 new/delete可以記錄棧記憶體使用的資訊
5.過載delete可以檢查到釋放記憶體釋放失敗的資訊,檢查到記憶體洩露
1.不能過載的過載符
域限定符::
直接成員訪問操作符 .
三目運算子?:
位元組長度操作符sizeof
型別資訊操作符typeid
2.過載操作符不能修改操作符的優先順序
3.無法過載所有基本型別的操作符運算
4.不能修改操作的引數個數
5.不能發明新的操作符
關於操作過載的建議:
1.在過載操作符的時候要根據操作符實際的功能和意義來確定具體引數,返回值,是否具有const屬性,返回值是否是引用或是臨時物件
2.過載操作符要符合情理(要有意義),要以實際用途為前提
3.過載操作符的意義是為了讓物件的操作更簡單,方便,而不是為了炫技
4.過載操作符要與預設的操作符的功能,運算規則一致,不要出***的操作
C 基礎 操作符過載
關於操作符過載,是c 乙個十分強大的功能。本文初略介紹下,涉及到友元以及函式過載 標頭檔案myclass.h ifndef myclass h define myclass h include include using namespace std class myclass myclass myc...
C 操作符過載
1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...
C 過載操作符
過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...