詳解C++-(=)賦值操作符、智能指針編寫
(=)賦值操作符
- 編譯器為每個(gè)類默認(rèn)重載了(=)賦值操作符
- 默認(rèn)的(=)賦值操作符僅完成淺拷貝
- 默認(rèn)的賦值操作符和默認(rèn)的拷貝構(gòu)造函數(shù)有相同的存在意義
(=)賦值操作符注意事項(xiàng)
首先要判斷兩個(gè)操作數(shù)是否相等
返回值一定是 return *this
; 返回類型是Type&型,避免連續(xù)使用=后,出現(xiàn)bug
比如:
class Test{ int *p; Test(int i) { p=new int(i); } Test& operator = (const Test& obj) { if(this!=obj) { delete p; p=new int(*obj.p); } return *this; } };
編譯器默認(rèn)提供的類函數(shù)
包括了:構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù), (=)賦值操作符
智能指針
智能指針的由來
在以前C程序里,使用malloc()等函數(shù)動(dòng)態(tài)申請(qǐng)堆空間時(shí),若不再需要的內(nèi)存沒有被及時(shí)釋放,則會(huì)出現(xiàn)內(nèi)存泄漏,若內(nèi)存泄漏太多,
則會(huì)直接導(dǎo)致設(shè)備停止運(yùn)行,特別是嵌入式設(shè)備,可能有些設(shè)備一上電就要運(yùn)行好幾個(gè)月.
在C++里,為了減少內(nèi)存泄漏,所以便引出了智能指針
介紹
- 智能指針實(shí)際上是將指針封裝在一個(gè)類里,通過對(duì)象來管理指針.
- 在構(gòu)造函數(shù)時(shí),通過對(duì)象將指針傳遞進(jìn)來,指針可以是缺省值.
- 然后構(gòu)造“ -> ” “ * ” “ = ”等操作符重載,讓這個(gè)對(duì)象擁有指針的特性.
- 最后通過析構(gòu)函數(shù),來釋放類里的指針.
注意
- 智能指針只能指向堆空間中的對(duì)象或者變量
- 并且一片空間最多只能由一個(gè)智能指針標(biāo)識(shí)(因?yàn)槎鄠€(gè)指向地址相同的智能指針調(diào)用析構(gòu)函數(shù)時(shí),會(huì)出現(xiàn)bug)
- ->和*都是一元操作符,也就是說不能帶參數(shù)
比如ptr->value的->:
當(dāng)ptr的類型是普通指針類型時(shí),等價(jià)于:(*ptr).mem
當(dāng)ptr的類型是類時(shí),等價(jià)于:(ptr.operator->())->value
等價(jià)于: ( *(ptr.operator->()) ).value
所以->操作符函數(shù)的返回類型是type*,返回值是一個(gè)指針變量本身(不帶*)
接下來個(gè)示例,指向一個(gè)int型的智能指針
#include <iostream> using namespace std; class Point{ int *p; public: Point(int *p=NULL) { this->p = p; } int* operator -> () { return p; } int& operator *() { return *p; } ~Point() { cout<<"~Point()"<<endl; delete p; } }; int main() { for(int i=0;i<5;i++) { Point p=new int(i); cout <<*p<<endl; } return 0; }
運(yùn)行打印:
0
~Point()
1
~Point()
2
~Point()
3
~Point()
~Point()
從結(jié)果可以看到, Point p每被從新定義之前,便會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)來釋放之前用過的內(nèi)存,這樣便避免了野指針的出現(xiàn)。
接下來,我們繼續(xù)完善上面代碼,使它能夠被賦值.
#include <iostream> using namespace std; class Point{ int *p; public: Point(int *p=NULL) { this->p = p; } bool isNULL() { return (p==NULL); } int* operator -> () { return p; } int& operator *() { return *p; } Point& operator = (const Point& t) { cout<<"operator =()"<<endl; if(this!=&t) { delete p; p = t.p; const_cast<Point&>(t).p=NULL; } return *this; } ~Point() { cout<<"~Point()"<<endl; delete p; } }; int main() { Point p=new int(2); Point p2; p2= p; //等價(jià)于 p2.operator= (p); cout <<"p=NULL:"<<p.isNULL()<<endl; *p2+=3; //等價(jià)于 *(p2.operator *())=*(p2.operator *())+3; //p2.operator *()返回一個(gè)int指針,并不會(huì)調(diào)用Point類的=操作符 cout <<"*p2="<<*p2 <<endl; return 0; }
運(yùn)行打印:
operator =()
p=NULL:1 // Point p的成員已被釋放
*p2=5
~Point()
~Point()
但是,還有個(gè)缺點(diǎn),就是這個(gè)智能指針僅僅只能指向int類型,沒辦法指向其它類型.
總結(jié)
以上所述是小編給大家介紹的C++-(=)賦值操作符、智能指針編寫,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留
言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
欄 目:C語言
下一篇:C++設(shè)計(jì)模式之觀察者模式(Observer)
本文標(biāo)題:詳解C++-(=)賦值操作符、智能指針編寫
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/840.html
您可能感興趣的文章
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載