cpp備忘摘錄

2021-07-09 16:36:45 字數 2503 閱讀 6356

staticconststatic const const static成員初始化

四種cast

隱式轉換與explicit

類建構函式

類的static函式

構造析構函式

虛函式與構造析構函式

int a1=3;   ///non-const data

const

int a2=a1; ///const data

intconst a2=a1;

const

int * a3 = &a1; ///const data,non-const pointer

int * const a4 = &a1; ///non-const data,const pointer

intconst * const a5 = &a1; ///const data,const pointer

const

int * const a6 = &a1; ///const data,const pointer

1.const位於*左側,指標所指資料是常量,不能通過解引用修改該資料;

2.const位於*右側,指標本身是常量,不能指向其他記憶體位址;

3.兩個const,*左右各乙個,表示指標和指標所指資料都不能修改。

隱式轉換的風險一般存在於自定義的類建構函式中。

按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件。

class string

//string s4 = 10; //編譯通過,也是分配10個位元組的空字串

//string s5 = 『a』; //編譯通過,分配int(『a』)個位元組的空字串

c++中提供了explicit關鍵字,在建構函式宣告的時候加上explicit關鍵字,能夠禁止隱式轉換。

class

test

複製構造函式引數為類物件本身的引用,用於根據乙個已存在的物件複製出乙個新的該類的物件。若沒有顯示的寫複製建構函式,系統會預設建立乙個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險

這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立。若沒有顯示的寫=運算子過載,則系統也會建立乙個預設的=運算子過載,只做一些基本的拷貝工作

complex &operator=( const complex &rhs )

// 複製等號右邊的成員到左邊的物件中

this->m_real = rhs.m_real;

this->m_imag = rhs.m_imag;

// 把等號左邊的物件再次傳出

// 目的是為了支援連等 eg: a=b=c 系統首先執行 b=c

// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)

return *this;

}

沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行「淺拷貝」,即將被拷貝物件的資料成員的值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標時則會導致兩次重複delete而出錯。

person(person & chs);

// 則新建立的物件的m_pname與原物件chs的m_pname不再指向同一位址了

}

子類無法繼承父類的建構函式和析構函式。

沒有顯示呼叫的情況下,會自動呼叫父類的構造/析構函式。

1)子類先呼叫基類的建構函式然後再呼叫自己的建構函式

2)子類是呼叫自身的析構函式再呼叫基類的析構函式

顯示呼叫建構函式形式為:

子類建構函式名(子類總引數列表):父類建構函式名(引數列表)

2) 建構函式不能是虛函式,因為構造子類時本身也是呼叫的子類建構函式,然後子類建構函式會呼叫基類建構函式,所以虛建構函式的存在是沒有意義的。只有在構造完成後,物件才能成為乙個類的名符其實的例項。

3) 靜態成員函式和內聯函式也不能是虛函式。

3) 析構函式可以是虛函式,而且,在乙個複雜類結構中,這往往是必須的。

4) 將乙個函式定義為純虛函式,實際上是將這個類定義為抽象類,不能例項化物件。

6) 析構函式可以是純虛的,但純虛析構函式必須有定義體,因為析構函式的呼叫是在子類中隱含的。

8) 派生類的override虛函式定義必須和父類完全一致。除了乙個特例,如果父類中返回值是乙個指標或引用,子類override時可以返回這個指標(或引用)的派生。例如,在上面的例子中,在base中定義了 virtual base* clone(); 在derived中可以定義為 virtual derived* clone()。可以看到,這種放鬆對於clone模式是非常有用的。

CPP學習備忘 9 多型

雖然從廣義上說,資料型別是資料結構在一定的程式語言中的描述形式,但實際上描述群體資料 容器 的抽象資料型別才是資料結構的真正體現。類定義不占用任何記憶體空間,也沒有任何物件的預處理,所以沒有任何操作上的開銷。乙個操作隨著所傳遞或 的物件型別的不同能夠做出不同的反應,其行為模式稱為多型。c 中採用一種...

CPP學習備忘 12 模板

模板使程式設計師能夠快速建立具有型別安全的類庫集合和函式集合,以方便更大規模的軟體開發。c 的stl全賴於模板實現,模板是c 物件導向程式設計的重要補充。函式模板的定義形式為 template 型別參數列 返回型別 函式模板名 資料參數列 函式模板定義體 函式模板不是函式,它是以具體的型別為實參來生...

CPP學習備忘 1 基本程式設計語句

switch括號中的表示式只能是整型 字元型或列舉型表示式。case後面的常量表示式之型別必須與其匹配。流iostream主管資料型別的識別工作和溝通作業系統,全權負責把流中的資料送到對應的裝置上。流的格式操作亦可直接以輸出流的方式操作。常用的流狀態 showpos 在正數 包括0 之前顯示 號 l...