const定義常量和#define定義常量的區(qū)別
1、const常量有數(shù)據(jù)類型,而宏常量沒(méi)有數(shù)據(jù)類型
2、有些集成化的調(diào)試工具可以對(duì)const常量進(jìn)行調(diào)試,但不能對(duì)宏常量進(jìn)行調(diào)試。
強(qiáng)烈建議在C++程序中使用const常量而不使用宏常量。
Ø 存儲(chǔ)類
1、auto(自動(dòng)的)
auto變量是用堆棧方式占用內(nèi)存空間的,擔(dān)當(dāng)程序執(zhí)行到變量所屬段外時(shí),內(nèi)存立即回收。
2、register(寄存的)
聲明register變量,它告訴編譯器,如果可能則將此變量保存在寄存器中,可以加快程序的速度。
3、static(靜態(tài)的)
在C++中用固定的地址來(lái)保存靜態(tài)變量。只要程序在運(yùn)行,靜態(tài)變量就不會(huì)隨著運(yùn)行段的結(jié)束而消失。定義靜態(tài)變量必須進(jìn)行初始化。
4、extern(外部的)
外部變量的作用域是程序級(jí)的。即當(dāng)一個(gè)變量被定義為外部變量后,該程序中其他所有的函數(shù)或程序段都可以引用這個(gè)變量。由于它具有可同時(shí)被其他函數(shù)引用的特性,而且在程序運(yùn)行期間永不消失,因此可以用來(lái)在函數(shù)之間傳遞數(shù)據(jù)。
Ø typedef
用來(lái)自定義數(shù)據(jù)類型。
Ø 類
類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。
在類體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。
Ø 對(duì)象
類的實(shí)例
Ø 構(gòu)造函數(shù)
構(gòu)造函數(shù)是一種特殊的類成員函數(shù),它的作用是對(duì)類的數(shù)據(jù)成員進(jìn)行初始化和分配內(nèi)存。
特點(diǎn):
1、構(gòu)造函數(shù)可以重載。
2、在程序中不能顯示的調(diào)用構(gòu)造函數(shù),當(dāng)創(chuàng)建對(duì)象時(shí)構(gòu)造函數(shù)將自動(dòng)被調(diào)用。
3、構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可以寫在類體內(nèi),也可以寫在類體外。
4、構(gòu)造函數(shù)是一個(gè)特殊的函數(shù),函數(shù)名與類名相同,該函數(shù)不指定類型說(shuō)明,它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。
5、運(yùn)算符new用于建立在生產(chǎn)期可控的對(duì)象,new返回指向所創(chuàng)建的對(duì)象的指針。new運(yùn)算符與構(gòu)造函數(shù)一同起作用,當(dāng)用new運(yùn)算符動(dòng)態(tài)創(chuàng)建對(duì)象時(shí),構(gòu)造函數(shù)將被自動(dòng)調(diào)用。
Ø 拷貝初始化構(gòu)造函數(shù)
拷貝初始化構(gòu)造函數(shù)是一種特殊的成員函數(shù),其功能是用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)被創(chuàng)建的同類的對(duì)象。
特點(diǎn):
1、拷貝初始化構(gòu)造函數(shù)名和類名相同,因?yàn)樗彩且环N構(gòu)造函數(shù)。
2、拷貝初始化構(gòu)造函數(shù)只有一個(gè)參數(shù),并且是對(duì)某個(gè)對(duì)象的引用。
3、每個(gè)類都必須有一個(gè)拷貝初始化構(gòu)造函數(shù),如果類中沒(méi)有說(shuō)明拷貝初始化構(gòu)造函數(shù),則編譯器將自動(dòng)生成一個(gè)缺省的拷貝初始化構(gòu)造函數(shù),并作為該類的公有成員。
Ø 析構(gòu)函數(shù)
析構(gòu)函數(shù)也是一種特殊的類成員函數(shù),它的作用是釋放在構(gòu)造函數(shù)中分配的內(nèi)存空間。
特點(diǎn):
1、在一個(gè)類中只能定義一個(gè)析構(gòu)函數(shù),且不能重載。
2、析構(gòu)函數(shù)可以被顯示的聲明,也可以由系統(tǒng)自動(dòng)調(diào)用。
3、析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可以寫在類體內(nèi),也可以寫在類體外。
4、當(dāng)一個(gè)對(duì)象是用new運(yùn)算符動(dòng)態(tài)創(chuàng)建時(shí)的,在使用delete運(yùn)算符釋放它時(shí),delete將自動(dòng)調(diào)用析構(gòu)函數(shù)。
Ø 內(nèi)聯(lián)函數(shù)
C++語(yǔ)言之所以引入內(nèi)聯(lián)函數(shù),主要是為了解決程序中函數(shù)調(diào)用的效率問(wèn)題。
內(nèi)聯(lián)函數(shù)和宏的比較:
1、對(duì)內(nèi)聯(lián)函數(shù)的調(diào)用是由編譯器進(jìn)行處理的,而對(duì)宏的調(diào)用是由預(yù)處理進(jìn)行擴(kuò)展的
2、內(nèi)聯(lián)函數(shù)調(diào)用時(shí),編譯器要檢查傳遞過(guò)來(lái)的參數(shù)類型,確保不傳入非法類型
3、如果傳入函數(shù)是表達(dá)式,則此表達(dá)式值僅僅一次
4、宏的優(yōu)點(diǎn)是你傳給宏什么數(shù)據(jù),它就返回同一個(gè)類型
Ø 靜態(tài)成員
靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問(wèn)題。
1、靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員的初始化需要注意以下幾點(diǎn):
l 靜態(tài)數(shù)據(jù)成員的初始化在類體外進(jìn)行,前面不加static,以免與一般的靜態(tài)變量或?qū)ο蠡煜?/span>
l 初始化時(shí)不加該成員的訪問(wèn)權(quán)限控制符。
l 初始化時(shí)使用作用域運(yùn)算符來(lái)標(biāo)明它所屬類,所以它屬于類的成員,不屬于對(duì)象的成員。
2、靜態(tài)成員函數(shù)
公有的靜態(tài)成員函數(shù)的一個(gè)重要的作用就是實(shí)現(xiàn)訪問(wèn)類的私有靜態(tài)數(shù)據(jù)成員。
定義靜態(tài)成員函數(shù)時(shí)注意以下幾點(diǎn):
l 由于關(guān)鍵字static不是函數(shù)類型的一部分,所以在類定義之外定義靜態(tài)成員函數(shù)時(shí)不能用static
l 靜態(tài)成員函數(shù)不能被說(shuō)明為虛函數(shù)
l 一個(gè)函數(shù)不能同時(shí)定義靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)
Ø 友元函數(shù)和友元類
1、友元函數(shù)
使用友元函數(shù)的目的是為了提高程序的效率。友元函數(shù)可以直接訪問(wèn)對(duì)象的私有成員,因此節(jié)省了調(diào)用類的成員函數(shù)的時(shí)間開(kāi)銷。
友元函數(shù)的另一個(gè)優(yōu)點(diǎn)是使程序員不必考慮好類的各種使用情況才能設(shè)計(jì)類,而是可以根據(jù)需要使用友元函數(shù)增加類的接口。
友元函數(shù)的缺點(diǎn)是,由于它可以訪問(wèn)私有成員,因而破壞的類的封裝性和隱藏性,導(dǎo)致程序可維護(hù)性差。
因此,建議應(yīng)當(dāng)盡量不使用或少用友元函數(shù)。
使用友元函數(shù)時(shí)注意以下幾點(diǎn):
l 在聲明友元函數(shù)時(shí),可以聲明為公有的,也可以聲明為私有的
l 類的友元函數(shù)不是本身的成員函數(shù),因此它沒(méi)有繼承性
l 友元函數(shù)不能使用存儲(chǔ)類修飾符來(lái)限定
2、友元類
友元類和友元函數(shù)類似。當(dāng)一個(gè)類(類B)作為另一個(gè)類(類A)的友元時(shí),這就意味著這個(gè)類(類B)的所有成員函數(shù)都是另一個(gè)類(類A)的友元函數(shù)。
Ø 對(duì)象指針
對(duì)象指針?lè)譃閮深悾?/span>
l 指向類類型對(duì)象的指針
l 指向類成員的指針
Ø 繼承與派生
繼承是一種客觀世界中普遍存在的機(jī)制,它可以使后輩從前輩那里得到屬性和行為特征,而繼承的過(guò)程就叫做派生。
繼承方式 | 基類中的訪問(wèn)權(quán)限 | 派生類中的訪問(wèn)權(quán)限 |
公有繼承 | Public Protected Private | Public Protected 不可訪問(wèn) |
私有繼承 | Public Protected Private | Private Private 不可訪問(wèn) |
保護(hù)繼承 | Public Protected Private | Protected Protected 不可訪問(wèn) |
1、公有繼承方式
l 基類成員對(duì)其對(duì)象(基類對(duì)象)的可見(jiàn)性:公有成員可見(jiàn),私有和保護(hù)成員不可見(jiàn)。
l 基類成員對(duì)派生類的可見(jiàn)性:公有成員和保護(hù)成員可見(jiàn),而私有成員不可見(jiàn)。
l 基類成員對(duì)派生類對(duì)象的可見(jiàn)性:公有成員可見(jiàn),私有和保護(hù)成員不可見(jiàn)。
2、私有繼承方式
l 基類成員對(duì)其對(duì)象(基類對(duì)象)的可見(jiàn)性:公有成員可見(jiàn),其他成員不可見(jiàn)。
l 基類成員對(duì)派生類的可見(jiàn)性:公有成員和保護(hù)成員是可見(jiàn)的,而私有成員是不可見(jiàn)的。
l 基類成員對(duì)派生類對(duì)象的可見(jiàn)性:所有成員都是不可見(jiàn)的。
3、保護(hù)繼承方式
l 基類成員對(duì)其對(duì)象(基類對(duì)象)的可見(jiàn)性:公有成員可見(jiàn),其他成員不可見(jiàn)。
l 基類成員對(duì)派生類的可見(jiàn)性:公有成員和保護(hù)成員是可見(jiàn)的,而私有成員是不可見(jiàn)的。
l 基類成員對(duì)派生類對(duì)象的可見(jiàn)性:所有成員都是不可見(jiàn)的。
4、繼承情況
l 在公有繼承的情況下,派生類的對(duì)象可以直接訪問(wèn)基類的共有成員
l 在私有繼承的情況下,基類的公有和保護(hù)成員都將成為派生類的私有成員
l 在私有繼承的情況下,基類的保護(hù)成員將成為派生類的私有成員,而無(wú)法再向下繼承
l 基類的保護(hù)成員在派生類中仍然是保護(hù)成員
l 基類的保護(hù)成員在公有派生的情況下可以被繼承到派生類的派生類
l 基類的保護(hù)成員對(duì)基類而言相當(dāng)于私有成員,但可以由派生類訪問(wèn)
l 在保護(hù)繼承的情況下,基類的公有成員和保護(hù)成員都成為派生類的保護(hù)成員
5、構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行
派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行是很重要的問(wèn)題
當(dāng)創(chuàng)建派生類對(duì)象時(shí),首先要調(diào)用基類的構(gòu)造函數(shù),接下來(lái)調(diào)用派生類字節(jié)的構(gòu)造函數(shù);而當(dāng)對(duì)象銷毀時(shí),析構(gòu)函數(shù)的調(diào)用次序正好相反,首先調(diào)用派生類的析構(gòu)函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù)。
6、多繼承的二義性
一般來(lái)說(shuō),在派生類中對(duì)基類成員的訪問(wèn)應(yīng)該是唯一的。但是,由于多繼承的情況下,可能造成對(duì)基類某個(gè)成員的訪問(wèn)出現(xiàn)不唯一的情況。這就是對(duì)基類成員訪問(wèn)的二義性。
l 通過(guò)作用域限定符
l 使用虛基類
虛基類的說(shuō)明是用在定義派生類時(shí),寫在派生類名的后面。
Ø 函數(shù)和運(yùn)算符重載
1、函數(shù)重載
函數(shù)重載是指同一個(gè)函數(shù)名可以對(duì)應(yīng)著多個(gè)函數(shù)的實(shí)現(xiàn)。函數(shù)重載時(shí)要求函數(shù)的參數(shù)或者至少有一個(gè)類型不同,或者個(gè)數(shù)不同。而對(duì)于函數(shù)的返回值類型沒(méi)有要求,可以相同,也可以不同。
l 重載與覆蓋的區(qū)別
重載:相同的作用域,函數(shù)名相同,函數(shù)的參數(shù)不同,virtual關(guān)鍵字可有可無(wú)。
覆蓋:不同的作用域,函數(shù)名相同,函數(shù)的參數(shù)相同,基類中的函數(shù)必須有virtual關(guān)鍵字。
l 隱藏
如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類的函數(shù)將被隱藏。
如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏。
2、運(yùn)算符重載
運(yùn)算符重載是指同一個(gè)操作符可以實(shí)現(xiàn)不同的功能,它與函數(shù)重載的概念相似。
l 重載算術(shù)運(yùn)算符
l 重載為類的友元函數(shù)
聲明重載為類的友元函數(shù)目的指在訪問(wèn)類的私有數(shù)據(jù)成員。
² 在C++語(yǔ)言中,幾乎所有的運(yùn)算符都可以重載,不允許重載的運(yùn)算符是:. :: .* ?
² 運(yùn)算符重載不會(huì)改變?cè)瓉?lái)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性
² 運(yùn)算符重載實(shí)際是一個(gè)函數(shù),所以運(yùn)算符重載實(shí)際上是函數(shù)的重載
² 運(yùn)算符重載要堅(jiān)持:不能改變運(yùn)算符原有的優(yōu)先級(jí);不能改變運(yùn)算符的操作個(gè)數(shù);不能改變運(yùn)算符原有的結(jié)合性;不能改變運(yùn)算符原有的語(yǔ)法結(jié)構(gòu)。
² 使用運(yùn)算符時(shí)要遵守的原則:重載的運(yùn)算符含義必須清楚;重載的運(yùn)算符不能有二義性。
² 運(yùn)算符重載一般采用成員函數(shù)形式和友元函數(shù)形式的兩種方式。
Ø Volatile修飾符
作用:告訴編譯器無(wú)需對(duì)變量作任何的優(yōu)化,即無(wú)需將它放到一個(gè)寄存器中,并且該值可被外部改變。對(duì)于多線程引用的全局變量來(lái)說(shuō),volatile是一個(gè)非常重要的修飾符。
Ø _variant_t類型
_variant_t是VARIANT的封裝類,其賦值可以使用槍支類型轉(zhuǎn)換,其構(gòu)造函數(shù)會(huì)自動(dòng)處理這些數(shù)據(jù)類型。使用時(shí)需加上#include <comdef.h>
_variant_t類型克服了普通數(shù)據(jù)類型在32位機(jī)器上的顯示,普通數(shù)據(jù)類型在32位上只能顯示10位,而_variant_t數(shù)據(jù)類型能顯示100位。
Ø 回調(diào)函數(shù)
回調(diào)函數(shù)是應(yīng)用程序提供給Windows系統(tǒng)DLL或其它DLL調(diào)用的函數(shù),一般用于截獲消息、獲取系統(tǒng)消息或處理異步事件。應(yīng)用程序把回調(diào)函數(shù)的地址指針告訴DLL,而DLL在適當(dāng)?shù)臅r(shí)候會(huì)調(diào)用該函數(shù)。
回調(diào)函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否則DLL一調(diào)用它就會(huì)引起程序或系統(tǒng)崩潰。通常情況下,回調(diào)函數(shù)采用標(biāo)準(zhǔn)WindowsAPI的調(diào)用方式,即__stdcall,當(dāng)然DLL編制者可以自己定義調(diào)用方式,但客戶程序也必須遵守相同的規(guī)定。
在__stdcall方式下,函數(shù)的參數(shù)按從右到左的順序壓入堆棧,除了明確指明是指針或應(yīng)用外,參數(shù)都按值傳遞,函數(shù)返回之前自己負(fù)責(zé)把參數(shù)從堆棧中彈出。
Ø 虛函數(shù)與多態(tài)性
1、基類指針與派生類指針
為什么將派生類對(duì)象地址賦給基類指針是合法的?因?yàn)?/span>C++的繼承采用了復(fù)制繼承的方式,派生類的對(duì)象要為基類的所有成員分配內(nèi)存空間(成員函數(shù)則分配函數(shù)指針空間),將它們存放在此空間,然后再存放派生類新增的成員;將基類對(duì)象的地址賦給派生指針需要強(qiáng)制類型轉(zhuǎn)換,但它是不安全的,因?yàn)槌绦騿T很有可能使用這個(gè)指針來(lái)訪問(wèn)并沒(méi)有實(shí)際定義的成員。
2、虛函數(shù)
聲明虛函數(shù)時(shí)要使用關(guān)鍵字virtual。、
Virtual 類型 函數(shù)名(參數(shù)列表);
派生類中對(duì)基類的虛函數(shù)進(jìn)行替換時(shí),要求派生類中說(shuō)明的虛函數(shù)和基類中的被替換的虛函數(shù)之間滿足如下條件:
l 與基類的虛函數(shù)有相同的參數(shù)個(gè)數(shù)。
l 其參數(shù)的類型與基類的虛函數(shù)的對(duì)應(yīng)參數(shù)類型相同。
l 其返回值或者與基類虛函數(shù)的相同,或者都返回指針或引用,并且派生類虛函數(shù)所返回的指針或引用的類型是基類中被替換的虛函數(shù)所返回的指針或引用的基類型的子類型。
l 虛函數(shù)的引入極大地方便了代碼重用,它使得程序員避免了逐個(gè)詳細(xì)定義每一個(gè)類。正是在引入虛函數(shù)的基礎(chǔ)上,類的層次關(guān)系得以實(shí)現(xiàn)。
純虛函數(shù)是一種特殊的虛函數(shù)。
Virtual 類型 函數(shù)名(參數(shù)列表)= 0;
5、抽象類
如果一個(gè)類包含有純虛函數(shù),則這個(gè)類稱為抽象類。抽象類是一種特殊類,它是為了抽象和設(shè)計(jì)的目的而建立的,它處于類的繼承層次的較上層。
抽象類的主要作用是將有關(guān)的類組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為它們提供一個(gè)公共的根,相關(guān)的子類都是從這個(gè)根派生出來(lái)的。
在定義抽象類的派生類時(shí),必須提供基類純虛函數(shù)的具體實(shí)現(xiàn),或者仍然將純虛函數(shù)說(shuō)明為純虛函數(shù),否則編譯器將給出錯(cuò)誤信息。如果派生類給出了純虛函數(shù)的集體實(shí)現(xiàn),則此派生類是一個(gè)具體的類,可以創(chuàng)建此類的對(duì)象;如果派生類只是繼承了基類的虛函數(shù),則此派生類仍然是一個(gè)抽象類。
Ø 模板
1、函數(shù)模板
l 函數(shù)模板:相當(dāng)于一個(gè)函數(shù)模子,可以用這個(gè)模子套印出許多功能相同、而參數(shù)類型和返回類型不同的函數(shù)。
l 聲明:template <class X> void myswap(X &a, X &b)
l 模板函數(shù)與重載函數(shù)的區(qū)別。
模板函數(shù)和重載函數(shù)是非常類似的,都是一組名字相同的函數(shù),模板函數(shù)處理的是只處理的數(shù)據(jù)類型不同,各個(gè)函數(shù)的內(nèi)部行為是一樣的;而重載函數(shù)除了處理的數(shù)據(jù)類型不同外,各個(gè)函數(shù)的內(nèi)部行為時(shí)不一樣的。
2、 類模板
l 類模板和模板函數(shù)的定義類似。
l 聲明:template <class SType> class mystk
在mystk類模板中的類型參數(shù)SType,它代表了棧中存儲(chǔ)對(duì)象的類型。要用類模板生成對(duì)象,必須先要給類模板的參數(shù)指定具體的數(shù)據(jù)類型,即類模板的實(shí)例化,類模板名 <具體的數(shù)據(jù)類型>
mystk<int> istack
l 類模板的實(shí)例化與類實(shí)例化是兩個(gè)不同的過(guò)程。類模板的實(shí)例化結(jié)果是生成實(shí)實(shí)在在的類;而類的實(shí)例化結(jié)果是生成對(duì)象,要為類對(duì)象分配空間,同時(shí)調(diào)用相應(yīng)的構(gòu)造函數(shù)初始化對(duì)象。
l 當(dāng)在類模板體外定義模板的成員函數(shù)時(shí),要在開(kāi)頭寫上template<class SType>,后面是函數(shù)的說(shuō)明,在函數(shù)名前要加上mystk<SType>::作用域說(shuō)明符,表示此函數(shù)是mystk類模板的函數(shù),SType是模板參數(shù)表中說(shuō)明的參數(shù)。
3、類模板的派生問(wèn)題
1、普通類作為基類
2、類模板作為基類
聯(lián)系客服