19 C 賦值操作符 初步編寫智慧型指標

2021-09-07 17:30:37 字數 2573 閱讀 4980

(=)賦值操作符

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

首先要判斷兩個運算元是否相等

返回值一定是return *this;返回型別是type&型,避免連續使用=後,出現bug

比如:

class

test

test& operator = (const test&obj)

return *this

; }

};

注意:指標物件之間賦值是不會呼叫(=)複製操作符的

編譯器預設提供的類函式

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

智慧型指標

智慧型指標的由來

在以前c程式裡,使用malloc()等函式動態申請堆空間時,若不再需要的記憶體沒有被及時釋放,則會出現記憶體洩漏,若記憶體洩漏太多,則會直接導致裝置停止執行,特別是嵌入式裝置,可能有些裝置一上電就要執行好幾個月.

在c++裡,為了減少記憶體洩漏,所以便引出了智慧型指標

介紹

注意

比如ptr->value的->:

當ptr的型別是普通指標型別時,等價於:(*ptr).mem

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

所以->操作符函式的返回型別是type*,返回值是乙個指標變數本身(不帶*)

具體參考:

接下來個示例,指向乙個int型的智慧型指標

#include using

namespace

std;

class

point

int* operator ->()

int& operator *()

~point()

};int

main()

return0;

}

執行列印:

0

~point()

1~point()

2~point()

3~point()

4~point()

從結果可以看到,point p每被從新定義之前,便會自動呼叫析構函式來釋放之前用過的記憶體,

這樣便避免了野指標的出現

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

#include 

using

namespace

std;

class

point

bool

isnull()

int* operator ->()

int& operator *()

point& operator = (const point&t)

return *this

; }

~point()

};int

main()

執行列印:

operator =()       

p=null:1

//point p的成員已被釋放

*p2=5

~point()

~point()

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

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

#include using

namespace

std;

template

class

point

bool

isnull()

t* operator ->()

t& operator *()

point& operator = (const point&t)

return *this

; }

~point()

}; intmain()

執行列印:

2

3.56

~point()

~point()

詳解C 賦值操作符 智慧型指標編寫

賦值操作符 賦值操作符注意事項 首先要判斷兩個運算元是否相等 返回值一定是return this 返回型別是type 型,避免連續使用 後,出現bug 比如 class test test operator const test obj return this 編譯器預設提供的類函式 包括了 建構函...

C 賦值操作符

定義類時,編譯器會自動幫我們定義的有四個 建構函式 析構函式 複製建構函式 賦值操作符。賦值操作符定義了該型別的物件賦值時會發生什麼。過載操作符是一些函式,其名字為operator後跟著所定義的操作符的符號。通過定義名為operator 的函式,我們可以對賦值操作符進行定義。該函式有返回值和形參表。...

C 類賦值( )操作符

如果使用者沒有編寫賦值操作符函式,編譯器就會自動為使用者建立乙個。這就是為什麼使用者可以實現p1 p2,為類賦值。語法 類名 operator const 類名 source arg 說到這裡,便想起來之前提到的副本構造器,用到副本構造器的地方其中之一是用某個物件去初始化另乙個物件。point a ...