極客班 C (上)第二週學習筆記

2021-07-15 18:11:40 字數 1809 閱讀 8004

今天在**首頁上看到一句話「程式設計師之所以犯錯誤,不是因為他們不懂,而是因為他們自以為什麼都懂。」私覺很有道理,但在自己與他人對問題出現分歧時,還是願堅持第一先相信自己。

這兩周課程主要講了類建立方面需要注意的東西。

第一周講的是class without pointer member ,

第二週講的是class with pointer member .

class without pointer member編譯器會自動生成建構函式(classname())、拷貝建構函式(classname(const classname&))、operator =(classname operator=(const classname&)),並且是正確可用的,當然此處自動生成的建構函式是無參建構函式,並且不執行實際操作,程式設計過程中還是應該按要求寫建構函式。由於沒有指標成員變數,也不需要寫析構函式(~classname)。

class

complex

complex& operator += (const

complex&);

double real () const

double imag () const

private:

double re, im;

friend

complex& __doapl (complex *, const

complex&);

};inline

complex&

__doapl (complex* ths, const

complex& r)

inline

complex&

complex::operator += (const

complex& r)

小注: 過載 operator+= 時,返回型別處一定要寫complex& ,原因同operator() 的過載。

class with pointer member編譯器依舊會自動生成建構函式、拷貝建構函式、operator =,但是由於class 中有指標成員變數,進行拷貝、=操作時只是進行了淺拷貝,即兩個class 中的指標指向同乙個位址。並且在delete時不能自動delete指標變數指向的區域,故需要寫析構函式。

即對於這種class 定義時必需要寫big three(拷貝構造、operator =、析構函式)。在建構函式中對於指標成員變數要分配空間(new);寫析構函式對指標成員變數指向的記憶體進行釋放;做拷貝時,也要對指標成員變數進行特殊操作(有需要時進行記憶體的釋放和重新分配)。

注:operator = 中需要判斷兩個class 例項是否是同乙個,判斷是否需要執行拷貝,避免self assignment。例子如下:

if(this = &classname) return*this;

class string

private:

char* m_data;

};inline

string::string(const

char* cstr)

else

}inline

string::~string()

inline

string& string::operator=(const string& str)

inline

string::string(const string& str)

注:本篇中classname表示類名,classname表示類例項

Geekban極客班 C 第五周

只要類裡帶有虛函式,物件裡就會多乙個指標。繼承函式是繼承函式的呼叫權,父類有虛函式則子類一定虛函式。虛指標vptr指向虛表vtbl,虛表中存放虛函式指標。c 編譯器遇到函式呼叫,有兩種方式 靜態繫結 動態繫結 動態繫結的三個條件 1.必須是通過指標呼叫 2.指標向上轉型 3.呼叫的是虛函式。動態繫結...

Geekban極客班C 第四周

operator double const 轉換函式 fraction f 3,5 double d 4 f operator double const為轉換函式,將物件的型別轉換為double。在執行d 4 f,編譯器先尋找是否過載了 符合表示式的要求,若沒有在找是否有轉換函式,改變f的型別。on...

C 第二週學習筆記

列舉型別和int型別的相互轉換 列舉型別和int型別相互相容,所以可以進行強制型別轉換 列舉型別,裡面預設儲存的是int。修改列舉型別 例 enmu qqstate short 在宣告列舉 名字後面 short int轉列舉。根據列舉的值進行轉換,如果值不存在,就不轉換,也不報錯。列舉型別和stri...