国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++-(=)賦值操作符、智能指針編寫

2020-01-26 13:44:28
字體:
供稿:網(wǎng)友

(=)賦值操作符

  • 編譯器為每個類默認重載了(=)賦值操作符
  • 默認的(=)賦值操作符僅完成淺拷貝
  • 默認的賦值操作符和默認的拷貝構(gòu)造函數(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)存泄漏太多,

則會直接導致設(shè)備停止運行,特別是嵌入式設(shè)備,可能有些設(shè)備一上電就要運行好幾個月.

在C++里,為了減少內(nèi)存泄漏,所以便引出了智能指針

介紹

  • 智能指針實際上是將指針封裝在一個類里,通過對象來管理指針.
  • 在構(gòu)造函數(shù)時,通過對象將指針傳遞進來,指針可以是缺省值.
  • 然后構(gòu)造“ -> ” “ * ” “ = ”等操作符重載,讓這個對象擁有指針的特性.
  • 最后通過析構(gòu)函數(shù),來釋放類里的指針.

注意

  • 智能指針只能指向堆空間中的對象或者變量
  • 并且一片空間最多只能由一個智能指針標識(因為多個指向地址相同的智能指針調(diào)用析構(gòu)函數(shù)時,會出現(xiàn)bug)
  • ->和*都是一元操作符,也就是說不能帶參數(shù)

比如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++-(=)賦值操作符、智能指針編寫,希望對大家有所幫助,如果大家有任何疑問請給我留

言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 常山县| 桓台县| 永德县| 吐鲁番市| 彰武县| 浮山县| 温州市| 丁青县| 石台县| 三明市| 井冈山市| 南丹县| 宾川县| 老河口市| 延长县| 安溪县| 普洱| 缙云县| 新源县| 渝北区| 石家庄市| 那坡县| 新河县| 敖汉旗| 丰镇市| 澄城县| 安多县| 郸城县| 通化市| 安塞县| 镇宁| 瑞丽市| 宿迁市| 水富县| 高安市| 宜宾市| 延庆县| 临漳县| 乌兰察布市| 平潭县| 乐山市|