今天在**首頁上看到一句話「程式設計師之所以犯錯誤,不是因為他們不懂,而是因為他們自以為什麼都懂。」私覺很有道理,但在自己與他人對問題出現分歧時,還是願堅持第一先相信自己。
這兩周課程主要講了類建立方面需要注意的東西。
第一周講的是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...