VC++(二)掌握C++

  • 結構體默認情況下,其成員是公有的。
  • 類默認情況下,其成員是私有的。
  • 一旦在類內定義了一個構造函數,不論這個函數帶不帶參數,類都不再提供默認的構造函數。

如果一個類沒有定義任何的構造函數,那么編譯器只會在以下三種情況,才會提供默認的構造函數。
1、如果類有虛擬成員函數或者虛擬繼承父類(即有虛擬基類時);
2、如果類有基類的構造函數(可以是用戶定義的,也可以是編譯器提供的默認構造函數);
3、在類的所有非靜態的對象數據成員,他們所屬的類中有構造函數(可以是用戶定義的,也可以是編譯器提供的默認構造函數)
析構函數只能有一個,且不允許帶任何參數在函數重載時,要注意函數帶有默認參數的情況

父類構造函數、子類構造函數、子類析構函數、父類析構函數

class animal
{
public:
    animal(int height, int weight)
    {
    }
}
class fish
{
public:
    fish()::animal(400, 300)
    {
    }
}fish fh; 先調用父類帶兩個參數的構造函數,然后調用子類不帶參數的構造函數

class point
{
public:
    point()::x(0), y(0) //一種初始化的方式
private:
    int x;
    int y;
}

public 定義的成員可以在任何地方被訪問
protected 定義的成員只能在該類及其子類中訪問
private 定義的成員只能在該類自身中訪問
基類中的private成員不能被派生類訪問,因此,private成員不能被派生類所繼承

舉例說明:
class animal
{
public:
    int publicMember;
protected:
    int protectedMember;
private:
    int privateMember;
}am;

class fish :public animal
{
}fh;

int main()
{
    fh.publicMember = 1; //OK
    fh.protectedMember = 1; //ERROR
    fh.privateMember = 1; //ERROR
    return 0;
}

class fish :private animal
{
}fh;

int main()
{
    fh.publicMember = 1; //OK
    return 0;
}
animal::publicMember”不可訪問,因為“fish”使用“protected”從“animal”繼承

總結一下:

  • 繼承類如果以public方式繼承基類,則基類的三個PPP不變,然后子類繼承基類。
  • 繼承類如果以protected方式繼承基類,則基類的public變成protected,protected不變,然后子類繼承基類。
  • 繼承類如果以private方式繼承基類,則基類的public、protected變成private,然后子類繼承基類。
  • 總之,是先改變基類的三個PPP,然后才從基類繼承。如果三個PPP都轉換成了私有,則子類相當于什么也沒有繼承。因為私有只能在類內訪問,不能在類外或者子類里面訪問。
    多重繼承時,初始化是按照基類列表中的說明順序進行初始化的。
    虛函數與多態性,純虛函數。
class animal
{   
public: 
    void eat()  
    {                   
        cout << "animal eat";           
    }
    void sleep()            
    {           
        cout << "animal sleep";                         
    }
            
    virtual void breathe()               
    {           
        cout << "animal breathe";           
    }
}; 
class fish :public animal
{
public:
    void breathe()
    {
        cout << "fish bubble"; 
    }
}           
void fn(animal pAn)
{
    pAn->breathe(); 
}
void main()
{
    animal pAn; 
    fish fh; 
    pAn = &fh; 
    fn(pAn); 
}

基類中void breathe()加virtual 不加virtual的區別

不加virtual時,輸出的是animal:
C++編譯器將fh進行了類型轉換,此時編譯器認為pAn保存的就是animal對象的地址。調的當然是animal。
用virtual關鍵字聲明的函數叫做虛函數。
C++的多態性用一句話概括就是:在基類的函數前加virtual關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。
也就是說,多態性是按照對象的實際類型來運行的。
純虛函數:
virtual void breathe() = 0;
含有純虛函數的類叫做抽象類。
抽象類不能聲明對象。
派生類中必須完全實現純虛函數。否則派生類也是抽象類,不能實例化。
無論該覆蓋定義是否有virtual關鍵字,該函數都是虛函數。

函數的覆蓋:

1、基類函數必須是虛函數
2、發生覆蓋的兩個函數分別位于派生類和基類中
3、函數名稱與參數列表必須完全相同

函數的隱藏兩種情況:

1、派生類的函數和基類的函數完全相同,只是基類的函數沒有virtual
2、派生類的函數與基類的函數同名,但參數列表不一樣。不管基類的函數有沒有virtual,基類的函數都將被隱藏。重載發生在一個類里面。
列表不一樣就隱藏了、沒有虛函數的事也隱藏了。
列表一樣,有虛函數叫覆蓋。
記住:函數覆蓋,參數列表一樣。
記住一句話:函數的覆蓋是發生在派生類與基類之間,兩個函數必須完全相同,并且都是虛函數,不屬于這種情況的就是隱藏了。
覆蓋了就不顯示了,隱藏了還可以顯示。

引用:

引用就是一個變量的別名
int a = 5;
int &b = a; //引用在聲明時必須初始化。
引用一旦初始化,它就代表了一塊特定的內存,不能再代表其他的內存。
指針是地址。指針變量要存儲地址值,因此要占用存儲空間。我們可以隨時修改指針變量所保存的地址值,從而指向其他的內存。
設計習慣以及頭文件重復包含的問題。
<> 和 "" 的區別。<> 和 "" 表示編譯器在搜索頭文件時的順序不同。
<> 表示 系統目錄、PATH環境變量列出的目錄,不搜索當前目錄。
"" 當前目錄、系統目錄、PATH環境變量列出的目錄。

條件預處理指令

#ifndef ANIMAL_H_H
#define ANIMAL_H_H

VC++ 程序編譯鏈接的原理與過程

C++對工程中的三個源文件單獨進行編譯。編譯時,先由預處理器對預處理指令進行處理,在內存中輸出翻譯單元。編譯器接受預處理器的輸出。將源代碼轉換成包含機器語言指令的三個目標文件(obj)。接下來鏈接器將目標文件和標準類庫一起鏈接生成exe文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容

  • 一個博客,這個博客記錄了他讀這本書的筆記,總結得不錯。《深度探索C++對象模型》筆記匯總 1. C++對象模型與內...
    Mr希靈閱讀 5,605評論 0 13
  • C++虛函數 C++虛函數是多態性實現的重要方式,當某個虛函數通過指針或者引用調用時,編譯器產生的代碼直到運行時才...
    小白將閱讀 1,748評論 4 19
  • 本文轉載自:(做了一些改動)http://www.cnblogs.com/feixiang927/p/504856...
    安然_fc00閱讀 6,017評論 1 6
  • 1. 結構體和共同體的區別。 定義: 結構體struct:把不同類型的數據組合成一個整體,自定義類型。共同體uni...
    breakfy閱讀 2,135評論 0 22
  • C++ 面向對象編程 博客園地址:http://www.cnblogs.com/xiongxuanwen/p/42...
    先之閱讀 687評論 0 1