有指標類與無指標類

2021-10-08 13:25:18 字數 2091 閱讀 7627

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在...

仿指標類與仿函式類

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