日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

19.C++-(=)赋值操作符、初步编写智能指针

發布時間:2023/12/19 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 19.C++-(=)赋值操作符、初步编写智能指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(=)賦值操作符

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

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

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

返回值一定是 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*,返回值是一個指針變量本身(不帶*)

具體參考: https://segmentfault.com/q/1010000004620896

?

接下來個示例,指向一個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() 4 ~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; //去掉const類型參數} 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類型,沒辦法指向其它類型.?

接下來繼續修改,通過類模板來使這個智能指針能指向多種類型

#include <iostream>using namespace std;template <typename T> class Point {T *p; public:Point(T *p){this->p = p; }bool isNULL(){return (p==NULL);}T* operator -> (){return p; } T& 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; //去掉const類型參數 } return *this;}~Point(){delete p; } };int main() { Point<int> p1=new int(2); cout<<*p1<<endl; Point<float> p2=new float(3.56); cout<<*p2<<endl;return 0; }

運行打印:

2 3.56
~Point()
~Point()

?

總結

以上是生活随笔為你收集整理的19.C++-(=)赋值操作符、初步编写智能指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。