孙鑫C++课程笔记2——创建类
Lesson 2
一、結(jié)構(gòu)體與類(lèi)型的區(qū)別:
與C語(yǔ)言不同的是,在C++中的結(jié)構(gòu)體允許擁有函數(shù)成員,這和類(lèi)有很大的相似性,二者的主要差別在于成員的訪問(wèn)權(quán)限上:
*缺省狀態(tài)下,結(jié)構(gòu)體的成員一律默認(rèn)為是Public的,可以在外部訪問(wèn),當(dāng)然也可以將這些成員聲明成Private的。
*缺省狀態(tài)下,類(lèi)的成員一律默認(rèn)為是Private的。
二、父類(lèi)與子類(lèi)的成員訪問(wèn)規(guī)則:
三、虛函數(shù)的概念
聲明方式:在函數(shù)頭前面加上關(guān)鍵字virtual : virtual void FunName(int ,int);
虛函數(shù)的引入是為了C++多態(tài) 的特性,一般的使用場(chǎng)景為:如果你聲明了一個(gè)父類(lèi)的指針指向一個(gè)子類(lèi)的對(duì)象,利用該指針進(jìn)行函數(shù)調(diào)用,那么,當(dāng)你調(diào)用的函數(shù)在父類(lèi)中聲明是虛函數(shù)時(shí),C++會(huì)采用遲綁定策略(late binding),根據(jù)指針指向的具體對(duì)象類(lèi)型判斷需要調(diào)用那個(gè)函數(shù),如果子類(lèi)中有這個(gè)函數(shù),則執(zhí)行子類(lèi)的函數(shù)定義,如果沒(méi)有,則執(zhí)行這個(gè)父類(lèi)的虛函數(shù)調(diào)用。
虛函數(shù)的實(shí)現(xiàn)實(shí)際上使用了一個(gè)虛函數(shù)表的概念,這個(gè)虛函數(shù)表解決了繼承和覆蓋的問(wèn)題,一個(gè)類(lèi)如果有虛函數(shù)的的時(shí)候,在創(chuàng)建一個(gè)這個(gè)類(lèi)的對(duì)象時(shí),該對(duì)象最前面的存儲(chǔ)空間位置會(huì)維護(hù)一個(gè)虛函數(shù)表,里面存放的是這個(gè)類(lèi)所有的虛函數(shù),存放順序按照函數(shù)聲明的先后順序,而且首先存放父類(lèi)的虛函數(shù),其次是子類(lèi)的,除非有覆蓋的情況發(fā)生。
純虛函數(shù)指的是沒(méi)有函數(shù)實(shí)現(xiàn),只有函數(shù)聲明的虛函數(shù),聲明方式為:
virtual void FunName()=0;
純虛函數(shù)是不能調(diào)用的,除非給了他的實(shí)現(xiàn)。例如,在父類(lèi)定義了一個(gè)純虛函數(shù),繼承的子類(lèi)給出了這個(gè)函數(shù)的實(shí)現(xiàn),那么這個(gè)子類(lèi)的對(duì)象就可以調(diào)用它,純虛函數(shù)往往用在設(shè)計(jì)父類(lèi)時(shí),不確定會(huì)不會(huì)在以后建立的派生類(lèi)中用得到某些函數(shù),可以先在父類(lèi)中給出這個(gè)純虛函數(shù)的聲明。
另外,當(dāng)子類(lèi)去繼承父類(lèi)的虛函數(shù)的時(shí)候,子類(lèi)的這個(gè)函數(shù)同樣是一個(gè)虛函數(shù),
不管有沒(méi)有在其前加上virtual關(guān)鍵字。在這種情況下,子類(lèi)函數(shù)會(huì)覆蓋父類(lèi)的函數(shù),在虛函數(shù)表上的表現(xiàn)就是:在這個(gè)子類(lèi)的對(duì)象最開(kāi)始的存儲(chǔ)空間上,子類(lèi)的虛函數(shù)代替了父類(lèi)的虛函數(shù)的位置,這樣如果你調(diào)用一個(gè)子類(lèi)對(duì)象的虛函數(shù),父類(lèi)的這個(gè)函數(shù)就不會(huì)產(chǎn)生影響。
四,引用
定義一個(gè)變量的引用,實(shí)際上是給這個(gè)變量一個(gè)別名定義方式為:
int a=0;
int &b=a;
上面就定義了一個(gè)變量a的別名,a和b指向同一個(gè)內(nèi)存空間,改變a的同時(shí)也會(huì)改變a;引用變量必須在定義時(shí)初始化。引用和指針在內(nèi)存空間上的區(qū)別:
引用與指針在使用上的區(qū)別在于,是代碼更具有邏輯性,例如,我們分別用引用和指針作為參數(shù)實(shí)現(xiàn)一個(gè)操作符“=”的重載函數(shù):
指針版本:ClassName operator =(ClassName * another);
引用版本:ClassName operator =(ClassName & another);
那么在調(diào)用的時(shí)候,二者的形式分別為:
指針版本: ClassName a;
ClassName b;
a=&b
引用版本: ClassName a;
ClassName b;
a=b;
顯然,傳遞引用更具有邏輯性;二者還具有其他形式的區(qū)別,簡(jiǎn)單表示為:
指針:變量,獨(dú)立,可變,可空,替身,無(wú)類(lèi)型檢查;
引用:別名,依賴,不變,非空,本體,有類(lèi)型檢查;
五,為什么包含自定義的頭文件用雙引號(hào),包含系統(tǒng)頭文件要用尖括號(hào)?
二者的主要區(qū)別在于搜尋文件路徑的起點(diǎn)上面;如果頭文件使用雙引號(hào)包含的,則從該項(xiàng)目(工程)的當(dāng)前目錄下開(kāi)始查找,如果使用的是尖括號(hào),則從系統(tǒng)目錄下開(kāi)始查找。其實(shí)可以統(tǒng)一用雙引號(hào),這樣的話,會(huì)先從當(dāng)前目錄下查找,如果沒(méi)有找到,則去系統(tǒng)目錄下查找。
六、使用命令代碼塊:
ifndefine abcdefg; //這只是隨便定義一個(gè)宏,不代表要使用它,與# define
define abcdefg 1; // # define abcdefg;等效
…
endif
在頭文件中,來(lái)防止頭文件被重復(fù)包含。
七、VC++程序編譯鏈接原理與過(guò)程
總結(jié)
以上是生活随笔為你收集整理的孙鑫C++课程笔记2——创建类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中的 %d %n \n %f
- 下一篇: 孙鑫VC++LESSON1:Window