C++允許用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類型不同?這就是函數(shù)的重載(function overloading)?即對(duì)一個(gè)函數(shù)名重新賦予它新的含義,使一個(gè)函數(shù)名可以多用?
C++提供了函數(shù)模板(function template)?所謂函數(shù)模板,實(shí)際上是建立一個(gè)通用函數(shù),其函數(shù)類型和形參類型不具體指定,用一個(gè)虛擬的類型來(lái)代表?這個(gè)通用函數(shù)就稱為函數(shù)模板?
凡是函數(shù)體相同的函數(shù)都可以用這個(gè)模板來(lái)代替,不必定義多個(gè)函數(shù),只需在模板中定義一次即可?在調(diào)用函數(shù)時(shí)系統(tǒng)會(huì)根據(jù)實(shí)參的類型來(lái)取代模板中的虛擬類型,從而實(shí)現(xiàn)了不同函數(shù)的功能?
定義函數(shù)模板的一般形式為:
template < typename T> 或 template <class T>
C++不允許對(duì)函數(shù)作嵌套定義,也就是說(shuō)在一個(gè)函數(shù)中不能完整地包含另一個(gè)函數(shù)?在一個(gè)程序中每一個(gè)函數(shù)的定義都是互相平行和獨(dú)立的?
在程序中實(shí)現(xiàn)函數(shù)嵌套調(diào)用時(shí),需要注意的是: 在調(diào)用函數(shù)之前,需要對(duì)每一個(gè)被調(diào)用的函數(shù)作聲明(除非定義在前,調(diào)用在后)?
在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸(recursive)調(diào)用?C++允許函數(shù)的遞歸調(diào)用?
對(duì)局部變量的一些說(shuō)明:- 主函數(shù)main中定義的變量(m,n)也只在主函數(shù)中有效,不會(huì)因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效?主函數(shù)也不能使用其他函數(shù)中定義的變量?
- 不同函數(shù)中可以使用同名的變量,它們代表不同的對(duì)象,互不干擾?例如,在f1函數(shù)中定義了變量b和c,倘若在f2函數(shù)中也定義變量b和c,它們?cè)趦?nèi)存中占不同的單元,不會(huì)混淆?
- 可以在一個(gè)函數(shù)內(nèi)的復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效,這種復(fù)合語(yǔ)句也稱為分程序或程序塊?
- 形式參數(shù)也是局部變量?
- 在函數(shù)聲明中出現(xiàn)的參數(shù)名,其作用范圍只在本行的括號(hào)內(nèi)?實(shí)際上,編譯系統(tǒng)對(duì)函數(shù)聲明中的變量名是忽略的,即使在調(diào)用函數(shù)時(shí)也沒(méi)有為它們分配存儲(chǔ)單元。
對(duì)全局變量的一些說(shuō)明:
- 設(shè)全局變量的作用是增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道?
- 建議不在必要時(shí)不要使用全局變量,因?yàn)?
① 全局變量在程序的全部執(zhí)行過(guò)程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元?
② 它使函數(shù)的通用性降低了,因?yàn)樵趫?zhí)行函數(shù)時(shí)要受到外部變量的影響?如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過(guò)去?但若該外部變量與其他文件的變量同名,就會(huì)出現(xiàn)問(wèn)題,降低了程序的可靠性和通用性?在程序設(shè)計(jì)中,在劃分模塊時(shí)要求模塊的內(nèi)聚性強(qiáng)?與其他模塊的耦合性弱?即模塊的功能要單一(不要把許多互不相干的功能放到一個(gè)模塊中),與其他模塊的相互影響要盡量少,而用全局變量是不符合這個(gè)原則的?
一般要求把程序中的函數(shù)做成一個(gè)封閉體,除了可以通過(guò)“實(shí)參——形參”的渠道與外界發(fā)生聯(lián)系外,沒(méi)有其他渠道?這樣的程序移植性好,可讀性強(qiáng)?
③ 使用全局變量過(guò)多,會(huì)降低程序的清晰性?在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變?nèi)肿兞康闹?程序容易出錯(cuò)?因此,要限制使用全局變量? - 如果在同一個(gè)源文件中,全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被屏蔽,即它不起作用?
可以用#define命令將一個(gè)指定的標(biāo)識(shí)符(即宏名)來(lái)代表一個(gè)字符串?定義宏的作用一般是用一個(gè)短的名字代表一個(gè)長(zhǎng)的字符串?它的一般形式為
#define 標(biāo)識(shí)符 字符串
這就是已經(jīng)介紹過(guò)的定義符號(hào)常量?如
#define PI 3.1415926
include命令的兩種形式
在#include命令中,文件名除了可以用尖括號(hào)括起來(lái)以外,還可以用雙撇號(hào)括起來(lái)?#include命令的一般形式為
#include <文件名>
或
#include ″文件名″
如
#include <iostream>
或
#include ″iostream″
都是合法的?二者的區(qū)別是: 用尖括號(hào)時(shí),系統(tǒng)到系統(tǒng)目錄中尋找要包含的文件,如果找不到,編譯系統(tǒng)就給出出錯(cuò)信息?
有時(shí)被包含的文件不一定在系統(tǒng)目錄中,這時(shí)應(yīng)該用雙撇號(hào)形式,在雙撇號(hào)中指出文件路徑和文件名?
如果在雙撇號(hào)中沒(méi)有給出絕對(duì)路徑,如#include ″file2.c″則默認(rèn)指用戶當(dāng)前目錄中的文件?系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找?
如果程序中要包含的是用戶自己編寫的文件,宜用雙撇號(hào)形式?
對(duì)于系統(tǒng)提供的頭文件,既可以用尖括號(hào)形式,也可以用雙撇號(hào)形式,都能找到被包含的文件,但顯然用尖括號(hào)形式更直截了當(dāng),效率更高?
關(guān)于C++標(biāo)準(zhǔn)庫(kù)在C++編譯系統(tǒng)中,提供了許多系統(tǒng)函數(shù)和宏定義,而對(duì)函數(shù)的聲明則分別存放在不同的頭文件中?如果要調(diào)用某一個(gè)函數(shù),就必須用#include命令將有關(guān)的頭文件包含進(jìn)來(lái)?
C++的庫(kù)除了保留C的大部分系統(tǒng)函數(shù)和宏定義外,還增加了預(yù)定義的模板和類?但是不同C++庫(kù)的內(nèi)容不完全相同,由各C++編譯系統(tǒng)自行決定?不久前推出的C++標(biāo)準(zhǔn)將庫(kù)的建設(shè)也納入標(biāo)準(zhǔn),
規(guī)范化了C++標(biāo)準(zhǔn)庫(kù),以便使C++程序能夠在不同的C++平臺(tái)上工作,便于互相移植?新的C++標(biāo)準(zhǔn)庫(kù)中的頭文件一般不再包括后綴.h,例如
#include <string>
但為了使大批已有的C程序能繼續(xù)使用,許多C++編譯系統(tǒng)保留了C的頭文件,即提供兩種不同的頭文件,由程序設(shè)計(jì)者選用?如
#include <iostream.h> //C形式的頭文件
#include <iostream>//C++形式的頭文件
效果基本上是一樣的?建議盡量用符合C++標(biāo)準(zhǔn)的形式,即在包含C++頭文件時(shí)一般不用后綴?如果用戶自己編寫頭文件,可以用.h為后綴?
條件編譯
一般情況下,在進(jìn)行編譯時(shí)對(duì)源程序中的每一行都要編譯?但是有時(shí)希望程序中某一部分內(nèi)容只在滿足一定條件時(shí)才進(jìn)行編譯,也就是指定對(duì)程序中的一部分內(nèi)容進(jìn)行編譯的條件?
如果不滿足這個(gè)條件,就不編譯這部分內(nèi)容?這就是“條件編譯”?
條件編譯命令常用的有以下形式:- #ifdef 標(biāo)識(shí)符
程序段1
#else
程序段2
#endif
它的作用是當(dāng)所指定的標(biāo)識(shí)符已經(jīng)被#define命令定義過(guò),則在程序編譯階段只編譯程序段1,否則編譯程序段2?#endif用來(lái)限定#ifdef命令的范圍?其中#else部分也可以沒(méi)有? - #if 表達(dá)式
程序段1
#else
程序段2
#endif
它的作用是當(dāng)指定的表達(dá)式值為真(非零)時(shí)就編譯程序段1,否則編譯程序段2?可以事先給定一定條件,使程序在不同的條件下執(zhí)行不同的功能?