原创 C\C++—— 繼承中構造函數和析構函數以及組合混搭下的構造析構調用規則

1、先構造父類,再構造成員變量、最後構造自己 2、先析構自己,在析構成員變量、最後析構父類 3、先構造的對象,後釋放 class Object { public: Object(int _a,int _b) {

原创 C\C++—— 繼承中的static關鍵字

1、基類定義的靜態成員,將被所有派生類共享 2、根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質 (遵守派生類的訪問控制)  3、派生類中訪問靜態成員,用以下形式顯式說明: 類名 :: 成員 或通過對象訪問

原创 C\C++—— 子類的vptr指針及證明vptr指針的存在

vptr指針會提前佈局,可以通過sizeof()求類的大小 class Parent1 { public: Parent1(int a = 0) { this->a = a; prient(); } virtual v

原创 C\C++—— 虛析構函數

構造函數不能是虛函數。建立一個派生類對象時,必須從類層次的根開始,沿着繼承路徑逐個調用基類的構造函數 析構函數可以是虛的。虛析構函數用於指引 delete 運算符正確析構動態對象 class A { public: A() {

原创 C\C++—— 多態

多態成立的三個條件 1、要有繼承 2、要有函數重寫  虛函數 3、要有父類指針(引用) 指向子類對象 多態是設計模式的基礎,多態是框架的基礎 1、C++中通過virtual關鍵字對多態進行支持 2、使用virtual聲明的函數被重寫後即可

原创 C\C++——類的繼承和訪問控制public、private、protected

“三看原則” 1.看調用語句,這句話寫在子類的內部還是外部 2.看子類如何從父類繼承 3.看父類的訪問級別   public:可以在類的內部和外部訪問 private:只能在類的內部訪問(派生類中訪問不了基類的私有變量) proteced

原创 C\C++——友元函數和友元類(friend)

關鍵字 friend(破壞了類的封裝性) class MyFriend { //友元類(破壞了類的封裝性) friend class MyClass; public: MyFriend(int a=0, int b=0) {

原创 C\C++——this指針

class Test { public: Test(int a,int b)//Test(Test *const this,int a,int b) { this->a = a; this

原创 C\C++——const修飾類的成員函數

/////////// void Fun(int a,int b)const { // } 請問const修飾的是誰 void Fun(ing a,int b)const <==> void Fun(const ClassNa

原创 C\C++——對象的動態建立和釋放(new&delete)

C:malloc  free C++: new  delete 在c語言中malloc只會分配內存大小,不會調用類的構造函數,free不會調用類的析構函數 //////////////////////////main //c int *

原创 C\C++——淺拷貝和深拷貝

class Name { public: Name(const char *str) { len = strlen(str); cout << len << endl;; p = (char *)malloc(len+1

原创 C\C++——構造函數的初始化例表

在B類中 組合一個A類的對象(A類設計了構造函數) 根據構造函數的調用規則 設計A的構造函數,必須要用 沒有機會初始化A 新的語法 Constructor::Constructor():m1(v1),m2(v1,v2),m3(v2) 類成

原创 C\C++——Copy構造函數和匿名對象

1:函數的返回值是一個元素 (複雜類型) 返回的是一個新的匿名對象(所以會調用匿名對象類的copy構造函數) 2:匿名對象的去和留 如果用匿名對象  初始化   另一個同類型的對象  匿名對象 轉成有名對象 如果用匿名對象  =賦值給  

原创 C\C++——構造函數和析構函數

構造函數 1)、類的成員函數名和類名相同 2)、定義時可帶有參數 3)、沒有返回值類型聲明 4)、在沒有提供構造函數時,通過類名聲明對象會調用默認的構造函數 5)、一般情況下我們需要手工調用構造函數 析構函數 1)、C++中的類可以定義一

原创 C\C++——拷貝構造函數的調用

賦值構造函數 用一個對象初始化另一個對象 特別注意: 初始化操作 和 等號操作 是兩個不同的概念 1、初始化法 Class A { public: A(int a) { m_a = a; }