中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-30 08:38:15 來源:腳本之家 閱讀:152 作者:LifeYx 欄目:編程語言

(=)賦值操作符

  • 編譯器為每個類默認重載了(=)賦值操作符
  • 默認的(=)賦值操作符僅完成淺拷貝
  • 默認的賦值操作符和默認的拷貝構造函數有相同的存在意義

(=)賦值操作符注意事項

首先要判斷兩個操作數是否相等

返回值一定是 return *this; 返回類型是Type&型,避免連續使用=后,出現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;
    }
};

編譯器默認提供的類函數

包括了:構造函數,析構函數,拷貝構造函數, (=)賦值操作符

智能指針

智能指針的由來

在以前C程序里,使用malloc()等函數動態申請堆空間時,若不再需要的內存沒有被及時釋放,則會出現內存泄漏,若內存泄漏太多,

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

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

介紹

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

注意

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

比如ptr->value的->:

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

當ptr的類型是類時,等價于:(ptr.operator->())->value    等價于: ( *(ptr.operator->()) ).value

所以->操作符函數的返回類型是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()

從結果可以看到, Point p每被從新定義之前,便會自動調用析構函數來釋放之前用過的內存,這樣便避免了野指針的出現。

接下來,我們繼續完善上面代碼,使它能夠被賦值.

#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指針,并不會調用Point類的=操作符
    cout <<"*p2="<<*p2 <<endl;
    return 0;
}

運行打印:

operator =()      
p=NULL:1              // Point  p的成員已被釋放
*p2=5
~Point()
~Point()

但是,還有個缺點,就是這個智能指針僅僅只能指向int類型,沒辦法指向其它類型.

總結

以上所述是小編給大家介紹的C++-(=)賦值操作符、智能指針編寫,希望對大家有所幫助,如果大家有任何疑問請給我留

言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

咸阳市| 祁门县| 县级市| 图木舒克市| 泰来县| 龙里县| 拉萨市| 宣化县| 策勒县| 乳源| 密云县| 开鲁县| 荆州市| 常宁市| 南平市| 和林格尔县| 天门市| 安陆市| 赤城县| 西充县| 建昌县| 丰顺县| 凤城市| 平顶山市| 潢川县| 吉隆县| 泗阳县| 洛阳市| 西安市| 鄂温| 芷江| 青田县| 昆山市| 嘉禾县| 牟定县| 平凉市| 子洲县| 镇远县| 合作市| 团风县| 阜新市|