欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年03月27日 17:27:14   作者:LifeYx  
C++的智能指針是克服C++大坑的非常有用的的手段,之所以說它智能,是因為它為程序員克服了重要的編程問題——懸掛指針,下面通過本文給大家分享C++-(=)賦值操作符、智能指針編寫,感興趣的朋友一起看看吧

(=)賦值操作符

  • 編譯器為每個類默認(rèn)重載了(=)賦值操作符
  • 默認(rèn)的(=)賦值操作符僅完成淺拷貝
  • 默認(rèn)的賦值操作符和默認(rèn)的拷貝構(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;
    }
};

編譯器默認(rèn)提供的類函數(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)存泄漏,所以便引出了智能指針

介紹

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

注意

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

比如ptr->value的->:

當(dāng)ptr的類型是普通指針類型時,等價于:(*ptr).mem

當(dāng)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ù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • c語言中十進制轉(zhuǎn)二進制顯示小工具的實現(xiàn)代碼

    c語言中十進制轉(zhuǎn)二進制顯示小工具的實現(xiàn)代碼

    本篇文章是對c語言中十進制轉(zhuǎn)二進制顯示小工具的實現(xiàn)代碼進行了詳細的分析的介紹,需要的朋友參考下
    2013-05-05
  • 使用單鏈表實現(xiàn)多項式計算示例

    使用單鏈表實現(xiàn)多項式計算示例

    這篇文章主要介紹了使用單鏈表實現(xiàn)多項式計算示例,需要的朋友可以參考下
    2014-03-03
  • C語言實現(xiàn)CRC校驗算法的示例詳解

    C語言實現(xiàn)CRC校驗算法的示例詳解

    CRC(Cyclic Redundancy Check,循環(huán)冗余校驗)是一種常用的錯誤檢測技術(shù),用于驗證數(shù)據(jù)在傳輸或存儲過程中是否發(fā)生了錯誤,本文主要介紹了C語言如何實現(xiàn)CRC校驗算法,需要的可以參考一下
    2023-08-08
  • 如何將編譯過的C++庫迅速部署在Visual?Studio新項目中

    如何將編譯過的C++庫迅速部署在Visual?Studio新項目中

    本文介紹在Visual?Studio中,通過屬性表,使得一個新建解決方案中的項目可以快速配置已有解決方案的項目中各類已編譯好的C++第三方庫的方法,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C++特性之智能指針shared_ptr詳解

    C++特性之智能指針shared_ptr詳解

    shared_ptr是C++11提供的一種智能指針類,它足夠智能,可以在任何地方都不使用時自動刪除相關(guān)指針,從而幫助徹底消除內(nèi)存泄漏和懸空指針的問題。本文主要是來和大家聊聊shared_ptr的使用,需要的可以參考一下
    2022-12-12
  • c++ 函數(shù)指針相關(guān)總結(jié)

    c++ 函數(shù)指針相關(guān)總結(jié)

    這篇文章主要介紹了c++ 函數(shù)指針的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • Qt 使用QDialog實現(xiàn)界面遮罩的示例(蒙版)

    Qt 使用QDialog實現(xiàn)界面遮罩的示例(蒙版)

    界面遮罩在很多時候都可以用到,例如彈窗,本文主要介紹了Qt 使用QDialog實現(xiàn)界面遮罩的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++寫時拷貝實現(xiàn)原理及實例解析

    C++寫時拷貝實現(xiàn)原理及實例解析

    這篇文章主要介紹了C++寫時拷貝實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • C語言中的數(shù)據(jù)整除判斷問題

    C語言中的數(shù)據(jù)整除判斷問題

    這篇文章主要介紹了C語言中的數(shù)據(jù)整除判斷問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++模擬如何實現(xiàn)vector

    C++模擬如何實現(xiàn)vector

    這篇文章主要介紹了C++模擬如何實現(xiàn)vector問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論