類值類與類指標類

2021-08-20 20:50:00 字數 1351 閱讀 4025

類值類:

//行為像值的

class a

a(const a& a) :ps(new

string(*a.ps)), i(a.i) {} //每個類物件有自己的乙份資源拷貝

a& operator=(const a& rhs)

~a()

private:

string* ps;

int i;

};

//一種優化拷貝賦值運算子的方法:copy and swap

class a

a(const a& a) :ps(new

string(*a.ps)), i(a.i) {} //每個類物件有自己的乙份資源拷貝

a(a&& a)noexpect : ps(a.ps), i(a.i) //新增移動建構函式

a& operator=(a rhs) //值傳遞引數,左值呼叫拷貝建構函式,右值呼叫移動建構函式,實現了拷貝賦值運算子和移動賦值運算子

//運算子呼叫結束,析構函式執行,銷毀rhs,此時rhs指向原來左側物件記憶體

~a()

private:

string* ps;

int i;

};inline

void swap(const a& lhs, const a& rhs)

類指標類:

//行為像指標的類,物件共享底層資源,一種簡單實現:智慧型指標

class a

a(const a& a) :ps(a.ps), i(a.i) {} //拷貝指標

a& operator=(const a& rhs)

~a() {}

private:

shared_ptr ps;

int i;

};

//行為像指標的類,自己實現引用計數

class

a //初始化計數器為1

a(const a& a) :ps(a.ps), i(a.i), use(a.use) //呼叫拷貝建構函式會遞增引用計數

a& operator=(const a& rhs)

ps = rhs.ps;

i = rhs.i;

use = rhs.use;

return *this;

} ~a() //析構函式先遞減計數器,任何時候計數器為0就釋放記憶體

}private:

string* ps;

int i;

size_t* use;//指向計數器的指標,也要動態分配

};

有指標類與無指標類

c 中類可以有很多種劃分,對於新手來說,可以大概劃分為有指標類與無指標類。有指標類與無指標類的區別在於成員變數中是否有指標變數,在c c 中有無指標便意味著是否需要開闢記憶體空間,深拷貝,淺拷貝,野指標等一系列問題。接下來的幾篇文章將會初步的 以向有指標類與無指標類的區別。首先舉出兩個例子,分別代表...

仿指標類與仿函式類

乙個類,如果它的物件使用時像是指標,或者函式那麼這個類就是乙個仿指標類與仿函式類。在使用指標時,我們使用的運算子通常是 對於函式我們使用的是函式呼叫運算子,也就是 因此要使得乙個類像指標,那麼類內過載指標所使用的運算子不就行了。同理,要使得類像乙個函式,那麼類內過載函式呼叫符就行了。智慧型指標 乙個...

類物件和類指標

宣告 類物件 利用類的建構函式在記憶體中分配一塊記憶體,呼叫了建構函式 類指標 是乙個記憶體位址值,指向記憶體中存放的類物件,沒有呼叫建構函式 引用成員 物件用 指標用 物件生命期 若是成員變數,則是類的析構函式來釋放空間 若是函式中的臨時變數,則作用域是該函式體內 指標生命期 則需利用delete...