c++中類可以有很多種劃分,對於新手來說,可以大概劃分為有指標類與無指標類。有指標類與無指標類的區別在於成員變數中是否有指標變數,在c/c++中有無指標便意味著是否需要開闢記憶體空間,深拷貝,淺拷貝,野指標等一系列問題。接下來的幾篇文章將會初步的**以向有指標類與無指標類的區別。
首先舉出兩個例子,分別代表有指標類和無指標類
有指標類:string類
下面展示一些string
。
// string
var foo =
'bar'
;class
string
private
: char* m_data;
};
無指標類:complex類(複數)
下面展示一些內聯**片
。
// complex
class
complex
complex& operator +=
(const complex&
); complex& operator -=
(const complex&
);
complex& operator *=
(const complex&
);
complex& operator /=
(const complex&
);
double real()
const
double imag()
const
private
: double re, im;
上類都有建構函式,拷貝構造,析構函式,過載操作符。
complex
complex
(double r =
0, double i =0)
:re(r),
im(i)
使用初始化列表對複製操作。
string
string:
:string
(const char* cstr)
else
}
首先為m_data開闢空間,在使用拷貝函式複製傳入引數。
可以看出指標類和非指標類在構造時的區別為是否開闢空間。
並且要對傳入引數進行判空處理,如果為不為空new【strlen(cstr)+1】個char,如果為空newchar,多的乙個char是用於存放『\0』的。因為是new【】,所以在析構函式是會使用delete【】,關於new與delete的知識點之後會梳理一篇文章。
無指標類可以直接使用編譯器提供的預設拷貝建構函式,而指標類卻不可以,這是因為編譯器提供的預設的拷貝建構函式是按位元組複製的。這樣當寫出如下程式時
例子
。
string s1(「hello」);
string s2 ;
s2 = s1;
所期待的是
實際發生的確實這樣
1.b的指標與a的指標指向同一片記憶體,並未實現b是a的乙個複製,當a消亡時,b所指向的記憶體同時消亡。當a的內容改變時,b的內容同時改變,不能保留a改變之前的狀態。
2.b原本指向的記憶體空間未釋放造成記憶體洩露。直到程式完全結束時才會將記憶體返回給操做系統,增加作業系統記憶體的負擔,同時當大量記憶體未釋放時有記錄造成oom。
所以正確的做法應該是重寫string類的拷貝建構函式
string'拷貝構造
。
// an highlighted block
string& string:
:operator=
(const string& str)
類值類與類指標類
類值類 行為像值的 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 c...
類的this指標有以下特點
類的this指標有以下特點 1 this只能在成員函式中使用。全域性函式 靜態函式都不能使用this.實際上,成員函式預設第乙個引數為t const this。如 class a 其中,func的原型在編譯器看來應該是 int func a const this,int p 2 由此可見,this在...
仿指標類與仿函式類
乙個類,如果它的物件使用時像是指標,或者函式那麼這個類就是乙個仿指標類與仿函式類。在使用指標時,我們使用的運算子通常是 對於函式我們使用的是函式呼叫運算子,也就是 因此要使得乙個類像指標,那麼類內過載指標所使用的運算子不就行了。同理,要使得類像乙個函式,那麼類內過載函式呼叫符就行了。智慧型指標 乙個...