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