(慕課網視頻學習--C++離港篇的學習memo)1: 函數的參數預設值,只能在最右邊。 如果有三個參數,只有中間一個有預設值,這是錯誤的。 函數聲明的時候寫預設值,定義的時候不要寫。(有些編譯器會出錯。)2:內聯函數:編譯時,將函數體實參和代碼替換掉調用語句。 關聯字 inline 內聯函數是建議性 ...
(慕課網視頻學習--C++離港篇的學習memo)
1: 函數的參數預設值,只能在最右邊。 如果有三個參數,只有中間一個有預設值,這是錯誤的。
函數聲明的時候寫預設值,定義的時候不要寫。(有些編譯器會出錯。)
2:內聯函數:編譯時,將函數體實參和代碼替換掉調用語句。
關聯字 inline
內聯函數是建議性的,由編譯器決定。
邏輯簡單,調用頻繁的建議使用內聯。
遞歸函數不能成為內聯函數。
3: 記憶體申請 new 記憶體釋放 delete 註意,釋放數組的時候,用 delete []p;
申請可能失敗,
int *p = new int[100];
if(NULL == p){
//記憶體申請失敗
}
註意,釋放完記憶體後,再將相應的指針賦值為NULL;
4 string aaa = "Hello" + "world!"; // 這種定義是非法的,只能是常量+變數的形式。
5:類內定義的函數優先編譯成內聯函數!
------------------------------------------------------------------------------------
1: 構造函數 初始化列表
class Student{
public:
Student():name("Tom""), age(33){} //冒號開頭,多個變數的話,逗號隔開。
private:
int age;
string name;
}
註意: 初始化列表先於構造函數執行。 而且只能用於構造函數。
常量只能用初始化列表初始化。
2: 拷貝構造函數。把一個對象賦值給另外一個對象時,自動調用拷貝構造函數。
如果沒有,則自動生成一個預設的拷貝構造函數。
3 析構函數 ~類名() 釋放記憶體等工作。
不允許有參數。不能重載。沒有返回值。沒有的話,會自動生成一個預設的。
------------------------------------------------------------------------------------
C++繼承的時候,子類和父類有同名函數的時候
就說,子類的函數隱藏了父類的函數。
比如,父類是Person,子類是Solider
隱藏的函數是play()
調用子類的函數 solider.play();
調用父類的函數 solider.Person::play();
註意: 就運算元類的函數play加上參數,也必須用上面的方式調用父類的函數。
如果用父類指針指向子類對象,那麼父類的析構函數應該定義成虛函數。virtual
如果B,C 繼承A, D繼承B,C
這種就叫做菱形繼承,這個時候,A 需要再記憶體中只有一份。
B,C需要使用虛繼承。 如下麵代碼:
class B: virtual public A{};
------------------------------------------------------------------------------------
C++繼承的時候,子類和父類有同名函數的時候
就說,子類的函數隱藏了父類的函數。
比如,父類是Person,子類是Solider
隱藏的函數是play()
調用子類的函數 solider.play();
調用父類的函數 solider.Person::play();
註意: 就運算元類的函數play加上參數,也必須用上面的方式調用父類的函數。
如果用父類指針指向子類對象,那麼父類的析構函數應該定義成虛函數。virtual
C++中的抽象類是通過純虛函數來實現。