摘 要:const變量和內(nèi)聯(lián)函數(shù)是C++語言特有的語法,其功能和使用方法與C語言的宏定義有很多相似之處。本文簡(jiǎn)述了const變量和內(nèi)聯(lián)函數(shù)的功能與使用方法,通過與宏定義對(duì)比教學(xué),引導(dǎo)學(xué)生在掌握了宏定義的基礎(chǔ)之上,更深刻地理解const變量和內(nèi)聯(lián)函數(shù)的特點(diǎn)。
關(guān)鍵詞:const變量;內(nèi)聯(lián)函數(shù);宏定義;教學(xué)
一、引言
C++語言完全兼容C語言,具有C語言的全部功能。單純就程序語法的學(xué)習(xí)而言,如果已經(jīng)學(xué)習(xí)了C語言,那么再學(xué)習(xí)C++會(huì)輕松一些,只需要重點(diǎn)學(xué)習(xí)C++新增的語法知識(shí)即可,例如類、對(duì)象和繼承等等。const變量和內(nèi)聯(lián)函數(shù)也是C++新增的語法,其功能和使用方法與C語言的宏定義有很多相似之處,但是又有宏定義所不具備的優(yōu)點(diǎn)。在C++語言授課中有意識(shí)地與C語言的宏定義對(duì)照學(xué)習(xí),通過引導(dǎo)學(xué)生進(jìn)行對(duì)比分析,體會(huì)C++語法的優(yōu)點(diǎn),從而有效掌握新增知識(shí)點(diǎn)。
二、const變量
變量是程序運(yùn)行期間,其值可以改變的量。變量有名字,實(shí)際代表內(nèi)存中某一段存儲(chǔ)空間,其中可以存放數(shù)據(jù)即變量的值,存儲(chǔ)空間的大小由變量的數(shù)據(jù)類型決定。在C++程序中,所有的變量在使用之前都必須要定義。變量的定義主要是指出變量的名稱,確定變量的類型,并讓系統(tǒng)為其分配相應(yīng)的內(nèi)存空間。變量定義語句的一般形式為:
類型 變量名1,變量名2,……;
const變量又稱為只讀變量,其定義形式與普通變量極為相似,只不過是在數(shù)據(jù)類型的前面加上const而已。例如:
const float PI=3.14;
const變量必須在定義的時(shí)候立刻初始化,而且在程序執(zhí)行期間,其值不能夠被修改。在本例中PI用來存放圓周率π的值,它的值固定為3.14。C++語言的const變量其用法與C語言的符號(hào)常量,頗有相似之處。所謂符號(hào)常量,就是用標(biāo)識(shí)符表示的常量。C語言允許用宏定義的方式描述符號(hào)常量,例如:
#define PI 3.14
宏定義是指用#define開頭的預(yù)處理命令,有無參數(shù)和有參數(shù)兩種形式。它的作用是用一個(gè)標(biāo)識(shí)符來代表一個(gè)字符串,標(biāo)識(shí)符稱為宏名,字符串稱為宏體。在編譯預(yù)處理時(shí),把程序中該宏定義之后的所有宏名都用宏體替換,這稱為宏替換。在本例中PI稱為宏名,3.14稱為宏體。在程序中出現(xiàn)標(biāo)識(shí)符PI,即表示常量3.14。
表面上看const變量的實(shí)際效果似乎等同于符號(hào)常量,所以往往有學(xué)生會(huì)提問,既然用宏定義的方式就可以描述符號(hào)常量,為什么C++語言還要引入const變量呢?這時(shí)就需要給學(xué)生解釋強(qiáng)類型語言的概念。宏定義只是在程序編譯之前做簡(jiǎn)單的字符替換,即用3.14替代PI,并不進(jìn)行數(shù)據(jù)類型的檢查,這樣有可能會(huì)出現(xiàn)一些編譯階段所無法發(fā)現(xiàn)的錯(cuò)誤;而const變量除了其值不能被修改之外,其它方面完全與變量一樣。C++作為一種強(qiáng)類型語言,在操作之前,編譯器會(huì)對(duì)const變量進(jìn)行類型合法性檢查,從而有可能在編譯階段就發(fā)現(xiàn)一些錯(cuò)誤。這樣做既降低了程序調(diào)試的難度,又提高了程序的可靠性。就此可以乘勢(shì)建議學(xué)生在C++程序中,盡量用const變量,少用宏定義描述的符號(hào)常量。
三、內(nèi)聯(lián)函數(shù)
函數(shù)是C程序?qū)崿F(xiàn)模塊化結(jié)構(gòu)的主要手段,也是C++程序描述對(duì)象行為的主要方法。函數(shù)可以提高程序代碼的可讀性和重用性,便于調(diào)試和維護(hù)。但是函數(shù)調(diào)用也增加了額外的系統(tǒng)開銷,例如在程序執(zhí)行轉(zhuǎn)移時(shí),為函數(shù)的變量分配內(nèi)存的存儲(chǔ)空間,保存主調(diào)函數(shù)的執(zhí)行點(diǎn)(現(xiàn)場(chǎng))以及一些參數(shù)和寄存器的值等。C++語言允許程序員將那些代碼較短、調(diào)用頻繁的函數(shù)定義為內(nèi)聯(lián)函數(shù),以提高程序運(yùn)行的效率。內(nèi)聯(lián)函數(shù)的作用是,在調(diào)用它時(shí)并不發(fā)生通常的程序執(zhí)行轉(zhuǎn)移,而是把函數(shù)體的語句插入到函數(shù)調(diào)用處。inline是C++語言的關(guān)鍵字,用來定義內(nèi)聯(lián)函數(shù)。例如定義一個(gè)函數(shù)area,其功能是計(jì)算正方形的面積。代碼如下:
inline float area(float x)
{
return x*x;
}
從編寫程序的角度來看,內(nèi)聯(lián)函數(shù)的定義和調(diào)用與普通函數(shù)的定義和調(diào)用幾乎沒有什么差別,只不過內(nèi)聯(lián)函數(shù)在定義時(shí)多了一個(gè)inline關(guān)鍵字而已。程序運(yùn)行時(shí)內(nèi)聯(lián)函數(shù)并沒有發(fā)生真正的函數(shù)調(diào)用,而是類似于粘貼動(dòng)作一樣,自動(dòng)把函數(shù)體插入到每一個(gè)函數(shù)調(diào)用的位置。因此內(nèi)聯(lián)函數(shù)是以犧牲程序的空間為代價(jià),來換取程序運(yùn)行的時(shí)間。如果學(xué)生已經(jīng)學(xué)習(xí)過C語言的帶參數(shù)的宏定義,一定會(huì)發(fā)現(xiàn)它與內(nèi)聯(lián)函數(shù)非常相似。表面上看都具有函數(shù)的形式,有形參,使用時(shí)也是插入到調(diào)用之處等等。例如:
#define area(x) x*x
定義了一個(gè)帶參數(shù)的宏定義,在程序中如果出現(xiàn)area(3.2),將被自動(dòng)替換為3.2*3.2。通過內(nèi)聯(lián)函數(shù)與帶參數(shù)的宏定義的對(duì)比學(xué)習(xí),學(xué)生可能會(huì)問,既然帶參數(shù)的宏定義與內(nèi)聯(lián)函數(shù)如此相似,為什么C++語言還要提供內(nèi)聯(lián)函數(shù)這種機(jī)制呢?這就需要教師進(jìn)行深入分析,內(nèi)聯(lián)函數(shù)雖然執(zhí)行機(jī)制與帶參數(shù)的宏定義很相似,但它畢竟是C++的函數(shù),調(diào)用時(shí)C++編譯器會(huì)對(duì)它進(jìn)行類型檢查和參數(shù)檢查,計(jì)算實(shí)參的值,并依次賦給形參。而帶參數(shù)的宏定義在使用時(shí),只是作簡(jiǎn)單的替換工作,即用宏體替代宏名。這種方式是不進(jìn)行任何檢查的,因而會(huì)帶來一些隱患。
例如在程序中出現(xiàn)area(1+2),我們預(yù)期的結(jié)果顯然是9。但是替換之后變?yōu)?+2*1+2,結(jié)果卻是5??赡苡械膶W(xué)生已經(jīng)看出來了,只要帶參數(shù)的宏定義的形參帶上括號(hào),就能夠避免類似的問題,即寫為:#define area(x) (x)*(x)。此時(shí)教師可以接著提問,難道這樣做了之后,就可以高枕無憂了嗎?如果在程序中出現(xiàn)8/area(2),我們預(yù)期的結(jié)果顯然是2。但是替換之后變?yōu)?/(2)*(2),結(jié)果卻是8。進(jìn)一步啟發(fā)學(xué)生,即可得出結(jié)論,實(shí)際上要想做到萬無一失,只能寫成以下形式:#define area(x) ((x)*(x))。因此相比較而言,內(nèi)聯(lián)函數(shù)沒有帶參數(shù)的宏定義所可能有的副作用,是一種執(zhí)行效率較高,也較為安全的語法。通過案例對(duì)比分析,學(xué)生就會(huì)較為容易地接受內(nèi)聯(lián)函數(shù),并樂于在C++程序中采用。
四、結(jié)語
相對(duì)類、對(duì)象和繼承而言,const變量和內(nèi)聯(lián)函數(shù)并不是C++語言的核心語法。但是通過與C語言的宏定義對(duì)比教學(xué)中,還是可以讓學(xué)生深刻理解const變量和內(nèi)聯(lián)函數(shù)的特點(diǎn),并逐漸體會(huì)C++語言的優(yōu)點(diǎn),在程序中熟練運(yùn)用。
參考文獻(xiàn):
[1] 王曉東. C++程序設(shè)計(jì)簡(jiǎn)明教程(第二版)[M].北京:中國水利水電出版社, 2017.
[2] 鄭莉. C++語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社, 2001.
[3] 江義華. C/C++完美演繹[M].北京:中國水利水電出版社, 2001.