類值類:
//行為像值的
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...