(=)賦值操作符
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的隨縣網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
(=)賦值操作符注意事項
首先要判斷兩個操作數(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; } };
編譯器默認提供的類函數(shù)
包括了:構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù), (=)賦值操作符
智能指針
智能指針的由來
在以前C程序里,使用malloc()等函數(shù)動態(tài)申請堆空間時,若不再需要的內(nèi)存沒有被及時釋放,則會出現(xiàn)內(nèi)存泄漏,若內(nèi)存泄漏太多,
則會直接導(dǎo)致設(shè)備停止運行,特別是嵌入式設(shè)備,可能有些設(shè)備一上電就要運行好幾個月.
在C++里,為了減少內(nèi)存泄漏,所以便引出了智能指針
介紹
注意
比如ptr->value的->:
當ptr的類型是普通指針類型時,等價于:(*ptr).mem
當ptr的類型是類時,等價于:(ptr.operator->())->value
等價于: ( *(ptr.operator->()) ).value
所以->操作符函數(shù)的返回類型是type*,返回值是一個指針變量本身(不帶*)
接下來個示例,指向一個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; }
運行打印:
0
~Point()
1
~Point()
2
~Point()
3
~Point()
~Point()
從結(jié)果可以看到, Point p每被從新定義之前,便會自動調(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; //等價于 p2.operator= (p); cout <<"p=NULL:"<<p.isNULL()<<endl; *p2+=3; //等價于 *(p2.operator *())=*(p2.operator *())+3; //p2.operator *()返回一個int指針,并不會調(diào)用Point類的=操作符 cout <<"*p2="<<*p2 <<endl; return 0; }
運行打印:
operator =()
p=NULL:1 // Point p的成員已被釋放
*p2=5
~Point()
~Point()
但是,還有個缺點,就是這個智能指針僅僅只能指向int類型,沒辦法指向其它類型.
總結(jié)
以上所述是小編給大家介紹的C++-(=)賦值操作符、智能指針編寫,希望對大家有所幫助,如果大家有任何疑問請給我留
言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
本文題目:詳解C++-(=)賦值操作符、智能指針編寫
本文URL:http://muchs.cn/article40/pjjiho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站設(shè)計、App設(shè)計、Google、響應(yīng)式網(wǎng)站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)