真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

(=)賦值操作符

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的隨縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

  • 編譯器為每個(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ù), (=)賦值操作符

智能指針

智能指針的由來(lái)

在以前C程序里,使用malloc()等函數(shù)動(dòng)態(tài)申請(qǐng)堆空間時(shí),若不再需要的內(nèi)存沒(méi)有被及時(shí)釋放,則會(huì)出現(xiàn)內(nèi)存泄漏,若內(nèi)存泄漏太多,

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

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

介紹

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

注意

  • 智能指針只能指向堆空間中的對(duì)象或者變量
  • 并且一片空間最多只能由一個(gè)智能指針標(biāo)識(shí)(因?yàn)槎鄠€(gè)指向地址相同的智能指針調(diào)用析構(gòu)函數(shù)時(shí),會(huì)出現(xiàn)bug)
  • ->和*都是一元操作符,也就是說(shuō)不能帶參數(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è)指針變量本身(不帶*)

接下來(lái)個(gè)示例,指向一個(gè)int型的智能指針

#include 
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()"<

運(yùn)行打印:

0
~Point()
1
~Point()
2
~Point()
3
~Point()
~Point()

從結(jié)果可以看到, Point p每被從新定義之前,便會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)來(lái)釋放之前用過(guò)的內(nèi)存,這樣便避免了野指針的出現(xiàn)。

接下來(lái),我們繼續(xù)完善上面代碼,使它能夠被賦值.

#include 
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 =()"<(t).p=NULL;
       }     
       return *this;
    }
    ~Point()
    {
     cout<<"~Point()"<http://weahome.cn/article/pjjiho.html
        

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部