C++day11 學習筆記

來源:互聯網
上載者:User

1、               本對象  子類對象  其他函數
 private屬性      可見    不可見     不可見
 protected屬性     可見     可見      不可見
 public屬性         可見     可見       可見

                      public extends       protected extends       private extends
 父類的private屬性       不能訪問               不能訪問                  不能訪問
 父類的protected屬性  變成protected                 不變             變成private,子類可以訪問,子類的子類不能訪問
 父類的public屬性          不變               變成protected          變成private,子類可以訪問,子類的子類不能訪問

2、 建構函式有很多種,因為沒有指定建構函式,就會預設使用無參的建構函式。如果父類沒有無參的建構函式,那麼就會出現編譯錯誤。
    可以使用這種形式Teacher(char* name, int age, double salary):Person(name,age){......},指定使用父類的有參建構函式。
 
3、多態的特徵:
        父類的指標可以指向子類的對象
        通過父類指標只能調用父類中聲明的方法
        通過指標調用函數的時候,若函數是個虛函數,表現出來的行為是對象自身的行為

4、產生多態:(1)指標
             (2)引用
   父類的引用可以引用一個子類對象
   通過父類引用只能調用父類函數
   調用一個父類被覆蓋了的,虛函數,能調用子類的函數
  
5、一個子類繼承一個父類  --- 單繼承
   一個子類繼承多個父類  --- 多繼承

   class SpiderMan : public Spider , public Person{....}  

6、菱形繼承,解決重複元素的衝突
   讓兩個父類同時虛繼承一個超類,把多繼承中的重複元素放在超父類中
   當有多個子類同時虛繼承一個父類的時候,只有一個子類真正的構造父類

   class Spider : vertual public Animal{.....};   class Person : vertual public Animal{.....};   class SpiderMan :public Person , public Spider{....};

   多繼承盡量不要使用三層以上
  
7、抽象類別
   只有函式宣告,沒有函數實現
   純虛函數:沒有實現的函數  virtual void writeLog(char*)=0;
             若不寫" =0 ",則系統會認為是函式宣告,會試圖去別的" .cc "檔案中去找函數實現
   含有純虛函數的類稱為抽象類別,是抽象資料類型,不能建立對象
   抽象類別型就是為了被別人繼承的,子類覆蓋純虛函數,提供函數實現
   通過父類規範子類的用法
  
   如果子類沒有完全實現抽象父類的所有純虛函數,則認為子類還是一個抽象資料類型

   用到virtual的地方:
   (1)繼承
   (2)多繼承
   (3)純虛函數
  
   抽象類別的規範很重要,在工程中,對於項目的並行開發很重要
   而且對於項目中的改動,能方便的應付
   用指標指向相應的子類對象,方便的調用子類的函數

8、友員
   針對類來說,自身的私人變數,不能被別的類訪問,但是,如果授權給一個類為自己的友員,就可以訪問他的私人屬性
   可以作為友員的東西:另一個類,一個全域函數。
  
   實現友員的授權:

      class Girl;      class  Person{           ........           friend class Girl;  //友員類的聲明-->授權給Girl類,成為自己的友員,可以訪問自己的私人變數了      }
      class Girl;      class  Person{           ........           friend void fn();  //友員函數的聲明-->授權給fn函數,成為自己的友員,可以訪問自己的私人變數了      }

    友員不是類的一部分
    若不是互為友員,則不能訪問友員類的私人變數
   
    友員的使用:
           Bus把售票員作為自己的友員,訪問自己的私人變數,即裝載乘客的數組
          
    友員在項目中的使用

9、待用資料
   在類中定義一個待用資料  (實際上就是一種全域變數)
   (1)不依賴於對象,在對象不存在之前就已經存在了
   (2)所有對象共用   
  
   與全域變數的區別:
   (1)使用的類中的靜態變數,必須通過類名使用
   (2)而且受存取控制符號的限制
   (3)靜態變數在類中聲明的時候不能賦值,要在類外初始化

        class A{        public :            static int a;        };        int A::a = 100;  //此時才分配空間        int main(){             cout << A::a <<endl;    //靜態變數的用法,不依賴對象,直接使用        }

    與成員變數的區別
    (1)成員變數依賴與對象,類對象不存在,成員變數也不存在
         靜態變數不依賴於對象,只要有類聲明,就存在
    (2)所有對象共用一份靜態變數
   
10、靜態函數
   在函數前加static
   不依賴於對象,沒有對象依然可以通過類名調用靜態函數
   A::fn();
  
   在類聲明的時候,靜態函數和靜態變數就存在了
   靜態函數只能使用靜態變數,不能使用成員變數

11、拷貝建構函式

   #include <iostream>   using namespace std;   class Person{   public:         Person(){ cout<<"Person()"<<endl; }         ~Person(){ cout<<"~Person() "<<endl;}         void speak(){ cout<<"hello"<<endl; }   };   void fn( Person p ){  //這裡的傳遞時值傳遞,形參是值傳遞,這裡的形參的建立是使用拷貝建構函式         p.speak();   }   int main(){         Person p ;         fn( p ) ;         return 0 ;   }

   輸出結果:

       Person()       hello       ~Person()       ~Person()         //2次析構,因為其中調用了的系統提供的拷貝建構函式,構造出一個新對象

   拷貝建構函式,以一個已存在的對象為模版建立一個新對象
  聲明方法: Person(const Person & p){...}  //即節省空間的,又保證模版不會被修改

   預設拷貝建構函式,執行的就是簡單的記憶體拷貝 --- 淺拷貝

   (1)淺拷貝
        只拷貝地址,而不是對指標指向空間的拷貝,會造成2個指標指向同一個空間
   (2)深拷貝
        為指標建立新空間,拷貝指標指向空間的內容

   調用拷貝建構函式的時機:    
   (1)在值傳遞的時候
   (2)A a;        //預設建構函式
        A a1 = a;   //在聲明的時候,用一個對象賦值,使用的是拷貝建構函式
   (3)A a1;
        A a2(a1);   //顯示的調用拷貝建構函式,傳的參數是個對象

    什麼時候需要自己寫拷貝建構函式?
         使用了動態記憶體,就會面臨淺拷貝的現象,需要自己寫拷貝建構函式

12、運算子多載
     a1 = a2;
     系統調用了函數 operator=
     相當於執行了這樣的操作:   a1.operator=(a2);      
    
     Student& operator= (const Student &a);
     函數返回左值,傳回值為引用
     函數返回右值,傳回值為本身

View Code

     /*     *student a1;     *student a2;     *a1=a2;  <=>  a1.operator=(a2);     */     Student& operator= (const Student &a){          age = a.age;          id = a.id;          strcpy(name , a.name);   //不用new出一塊空間,因為在聲明a1和a2的時候,兩個指標都指向一塊自己的空間,                                     把指標指向的變數拷貝過去,即完成賦值          return *this;     }

     當在堆中申請空間,則覆蓋賦值運算子(" = ")
    
作業:銀行系統的賬戶類
      把name , password 改用指標儲存
      (1)解構函式
      (2)拷貝構造
      (3)重載賦值運算子

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.