欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

(=)賦值操作符

  • 編譯器為每個(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++實(shí)現(xiàn)簡單貪吃蛇游戲

欄    目:C語言

下一篇:C++設(shè)計(jì)模式之觀察者模式(Observer)

本文標(biāo)題:詳解C++-(=)賦值操作符、智能指針編寫

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/840.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有