C++知識複習(二)

 1. 繼承時的名字遮蔽:
         派生類的成員和基類的成員重名,那麼就會遮攔從基類繼承過來的成員,派生類在使用該成員時實際上使用的派生類新增的成員而不是從基類繼承來的;
         在派生類和基類中,不管是成員變量還是成員函數,只要名字一樣就會造成名字遮蔽;
         
 2. 派生類的構造函數:
         構造函數不能被繼承,派生類的構造函數可以調用基類的構造函數類實現;
         如:Student::Student(char *name,int age,float score):People(name,age),m_score(score){},在這裏People類是Student的基類;
 3. 構造函數和析構函數的調用順序:
         派生類構造函數中只能調用直接基類的構造函數,不能調用間接基類的構造函數;基類的析構函數不能被繼承;
         例如:基類A,派生類B,B再派生出C;
         則它們的構造順序是A,B,C
         析構函數調用的順序是:C,B,A
         
 4. 多繼承類:
 

class C:publicA,public B,public D
{
};


        多繼承的構造函數和單繼承一樣,都是調用基類的構造函數;

 5. 命名衝突:
         當多繼承的時候,如果C分別從A和B集成函數,如果A和B中有相同名稱的函數,編譯器會報錯,這時候需要加上::來進行說明;
         

 6. 引用:
        相當於一個別名,語法格式:type&name = data;
        int xiaoW;
        int &xiaoG = xiaoW;
        a.&不是地址運算符,是一個引用運算符
        b.xiaoW,xiaoG變量的地址和值都一樣;
        c.引用只能初始化,不能先聲明後賦值,相當於一個常量;
        d.在聲明一個引用的時候必須初始化;
        e.這個別名別人不能用,只能使用這個變量使用;改變變量的值,這個別名的值也會改變;
        開始定義初始化的時候&表示引用運算符;
        引用初始化後,&表示區地址運算符;
        可以對對象和變量進行引用,但是不能對類進行引用,因爲類沒有內存地址;
        

 7. 引用和指針的比較:
        a.指針可以是空的,引用不能爲空;
        b.指針可以改變,引用初始化了,引用就不能改變成別的引用;
        c.在堆上創建了一塊內存,必需使用指針指向;不能使用引用;
        

 8. 虛函數:
         有了虛函數才能構成多態:
         a.在虛函數的聲明前加virtual關鍵字,在定義處可加可不加;
         b.只在基類中聲明虛函數,在派生類中有遮蔽關係函數名參數都一樣的都會自動轉爲虛函數;
         c.基類中聲明虛函數,在派生類沒有定義遮蔽關係的函數,自動調用其基類的虛函數;
         d.派生類的虛函數遮蔽基類虛函數,才能構成多態;
         e.構造函數不能是虛函數;
         f.析構函數可以聲明爲虛函數,有的時候必須聲明爲虛函數
         

 9. 虛析構的必要性:
         創造的基類指針pa指向指向派生類地址的時候,在釋放delete pa的時候,只釋放基類的析構函數,不是放派生類的析構函數;因爲pa是基類的地址,只能釋放基類析構;
         如果要是一起釋放基類和派生類,要把基類的析構函數設置成虛析構,這樣可以繼承。
         

 10. 靜態綁定和動態的綁定:
         a.靜態綁定:旨在編譯過程中就能確定的是哪一個函數,又稱爲編譯時多態性。主要是函數重載,運算符重載;
         b.動態綁定,在程序運行時在能確定是哪一個函數,又稱爲運行時多態。主要是繼承和虛函數。
         非虛函數都是靜態綁定,虛函數都是動態綁定;
         

 11. 純虛函數和抽象類:
         語法格式:
         virtual返回值類型 函數名(參數) = 0;
         a.純虛函數沒有函數體,只有聲明; = 0 只是告訴編譯器這是純虛函數
         b.包含純虛函數的類稱爲抽象類;
         c.抽象類通常爲基類,讓派生類去實現純虛函數,派生類必需實現純虛函數才能被實例化;
         其他方面:
         a.一個純虛函數可以是一個類稱爲抽象類,但是抽象類裏面除了包含純虛函數外,還可以包含其他的成員函數和變量;
         b.只有類中的虛函數才能聲明爲純虛函數,普通的成員函數和頂層函數不能聲明爲純虛函數;
         

 12. typeid的運算符:獲取表達式的類型信息
        格式:
        typeid(dataType)
        typeid(expression)
            dataType是數據類型,expression是表達式,
        type_info的成員函數:
        a.name()韓輝類型的名稱;
        b.raw_name()用來返回名字編碼;
        c.hash_code()用來返回當前類型的函數值;
    

 13. 重載:
         函數重載:讓一個函數名有多種功能,可以在不同情況下進行不同的操作;
         運算符重載:讓一個運算符具有不同的功能;
         運算符重載的格式:
         返回值 operator 運算符名稱(形參列表)
         {
                 //函數體;
        }

 14. 運算符重載的規則:
         a.不是所有的都可以,大部分就可以重載;不能重載的:sizeof,條件運算符?,成員選擇符.對象選擇符.*域的解析符::
        b.重載不能改變運算符的優先級和結合性;
            c1,c2,c3,c4
            c4 = c1 + c2*c3;
            先執行c2*c3, 然後+c1 = c4;
        c.重載不會改變運算符的用法;
        d.不能有默認的參數,否則改變了運算符操作的個數,是錯誤的。
        e.可以作爲類的成員函數,也可以作爲全局函數;
        f.->,[],(), = 只能以成員函數的形式出現;
        不對的例子:int operator + (int a , int b)
                                {
                                      return (a-b);
                                 }        
         +號原來是對兩個數相加,現在企圖通過重載改爲ie兩個數相減,如果允許這樣重載的話,那麼表達式4+3的結果是7還是1所以不對,這樣是禁止的。
             

 15. << >>重載:
        輸入元算符的重載>>
        輸入兩個數,保存到複數對象A中:
        istream&operator>>(istream %in , complex &A)
        {
                cin>>A.m_real>>A.imag;
                return cin;
        }
        istream表示輸入流,cin是istream類的對象;
        
        輸出運算符的重載<<
        ostream &operator<<(ostream &out , complex &A)
        {
                cout<<A.m_read<<"+"<<A.m_imag<<"i";
                return cout;
        }
        ostream:輸出流,cout是ostream的類的對象;

借鑑:https://blog.csdn.net/perfectguyipeng/article/details/73699218

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章