- 類型轉(zhuǎn)換
- 隱式類型轉(zhuǎn)換
又稱自動類型轉(zhuǎn)換,它是由編譯器自動進行的。轉(zhuǎn)換的規(guī)則按'存儲空間提升原則'進行,即存儲空間小的類型轉(zhuǎn)換成存儲空間大的類型,或精度低的類型轉(zhuǎn)換成精度高的類型,以保證運算結(jié)果盡可能精確。
char,short -> int -> unsigned -> long -> double
float -> double - 顯式類型轉(zhuǎn)換
人為進行強制類型轉(zhuǎn)換,如(int) (x+y)
- 參數(shù)傳遞機制
- 值傳遞
形參作為被調(diào)函數(shù)的內(nèi)部變量來處理,即開辟內(nèi)存空間以存放由主調(diào)函數(shù)復制過來的實參的值,從而成為實參的一個副本。值傳遞的特點是被調(diào)函數(shù)對形參的任何操作都是對內(nèi)部變量進行的,不會影響到主調(diào)函數(shù)的實參變量的值。 - 引用傳遞
被調(diào)函數(shù)的形參雖然也作為內(nèi)部變量開辟了內(nèi)存空間,但是這時存放的是由主調(diào)函數(shù)復制過來的實參的內(nèi)存地址,從而使得形參為實參的一個別名(形參和實參的內(nèi)存地址相同,則它們是同一個對象的兩個名稱)。被調(diào)函數(shù)對形參的任何操作實際上都是對主調(diào)函數(shù)的實參進行操作。
- 函數(shù)調(diào)用棧
函數(shù)調(diào)用時,為了能將參數(shù)傳遞到函數(shù)中,準確地返回到調(diào)用點以及返回函數(shù)值,使用棧來管理存儲器。
系統(tǒng)為每次函數(shù)調(diào)用在棧中建立獨立的??蚣埽Q為函數(shù)調(diào)用棧幀,其建立和撤銷是自動維護的。
函數(shù)調(diào)用約定最右邊的實參最先進棧。 - const參數(shù)和可變參數(shù)
const限定一個對象不允許被修改。
函數(shù)參數(shù)使用const限定的目的是確保形參對應的實參對象在函數(shù)體中不會被修改。對于基本類型的參數(shù),實參和形參本來就不是同一個內(nèi)存單元,互不影響,不用加const。但是如果是數(shù)組參數(shù),指針參數(shù)就有必要了。
形參至少需要第一個參數(shù)是普通形參,后面用三個點表示可變參數(shù),且只能位于函數(shù)形參列表的最后。 - 內(nèi)聯(lián)函數(shù)
函數(shù)調(diào)用時參數(shù)需要入棧,調(diào)用前需要保護現(xiàn)場并保存返回地址,調(diào)用后需要恢復現(xiàn)場并按原來保存的返回地址繼續(xù)執(zhí)行。因此函數(shù)調(diào)用需要時間和空間開銷,影響執(zhí)行效率。
C++提供一種提高函數(shù)效率的方法,即在編譯時將被調(diào)函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,取消調(diào)用這個環(huán)節(jié)。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為內(nèi)聯(lián)函數(shù),在函數(shù)定義的類型前加inline修飾符。
內(nèi)聯(lián)函數(shù)是以目標代碼的增加為代價來換取運行時間的節(jié)省。內(nèi)聯(lián)函數(shù)中不允許用循環(huán)語句和switch語句,遞歸函數(shù)也不能被用來做內(nèi)聯(lián)函數(shù)。 - 帶默認參數(shù)的函數(shù)
默認參數(shù)在函數(shù)聲明或者函數(shù)定義中只能設(shè)置一次,也就是編譯器見到過一次函數(shù)設(shè)置默認參數(shù),后面就不允許再次出現(xiàn)這個函數(shù)的默認參數(shù)設(shè)置。
可以設(shè)置多個默認參數(shù),但是設(shè)置順序為自右向左。
默認參數(shù)允許同一個函數(shù)名有多種調(diào)用方法。 - 函數(shù)重載
在同一個域中的同一個函數(shù)名可以用來定義多個函數(shù),但函數(shù)參數(shù)列表應彼此不同:參數(shù)個數(shù)不同,參數(shù)類型不同,或者兩者均不同。
編譯器根據(jù)參數(shù)類型和參數(shù)個數(shù)自動解析決定調(diào)用哪個版本的重載函數(shù)。 - 函數(shù)模板
函數(shù)模板定義一個通用型函數(shù),這些函數(shù)與類型無關(guān),并且只在需要時自行實例化,從而形成批量型的編程方式。
定義語法:
template<模板形參表> 返回類型 函數(shù)名(形式參數(shù)列表)
{
函數(shù)體
}
template<typename T>T add(T a, T b)
{
return a+b
}
- 函數(shù)調(diào)用形式
嵌套調(diào)用:在調(diào)用一個函數(shù)的過程中該函數(shù)又調(diào)用另一個函數(shù),稱為函數(shù)嵌套調(diào)用。
遞歸調(diào)用:函數(shù)直接或間接調(diào)用自己。可以這樣理解函數(shù)調(diào)用自己:實際上它在調(diào)用自身的一個副本,該副本是具有不同參數(shù)的另一個函數(shù),任何時候只有一個副本是活動的,其余的都將被掛起。 - 作用域
局部變量:在函數(shù)內(nèi)部或復合語句中定義的變量。局部變量只能在定義它的區(qū)域及其子區(qū)域中使用。
全局變量:在函數(shù)外部定義的變量。全部變量的有效區(qū)域是從定義變量的位置開始到源文件結(jié)束。
可以使用extern聲明將變量或函數(shù)實體的可見區(qū)域往前延伸,稱為前置聲明。
在全局作用域中,變量或函數(shù)實體若使用static修飾,則該實體對于其他源文件是屏蔽的,稱為私有的(private)。 - 程序映像和內(nèi)存布局
C++源程序經(jīng)過編譯和鏈接后,成為二進制形式的可執(zhí)行文件,稱為程序映像。運行程序時,由操作系統(tǒng)將可執(zhí)行文件裝入計算機內(nèi)存中,成為一個進程,程序在內(nèi)存中的布局由5個段組成(內(nèi)存地址由低到高):
代碼段
代碼段存放程序執(zhí)行的機器指令,可共享用來被頻繁執(zhí)行,通常是只讀的防止被意外的修改。已初始化的數(shù)據(jù)段
存放C++程序中所有已賦初值的全局和靜態(tài)變量、對象,也包括字符串、數(shù)組等常量,但是基本類型的常量不包含在其中,因為這些常量被編譯成指令的一部分存放在代碼段中。該段存儲單元的初始值在程序沒有運行時就固定下來了,在程序運行時沒有初始化操作。未初始化的數(shù)據(jù)段
存放C++程序中所有未賦初值的全局和靜態(tài)變量,數(shù)據(jù)值全都初始化為0。棧
放C++程序中所有局部的非靜態(tài)型變量、臨時變量、包含函數(shù)形參和返回值。
在程序映像中沒有棧,在程序開始運行時也不會分配棧。函數(shù)調(diào)用時開始得到分配,將函數(shù)棧框架入棧,函數(shù)調(diào)用結(jié)束時釋放空間,變量不存在。-
堆
存放C++程序中動態(tài)分配的存儲空間。
在程序映像中沒有堆,在程序開始運行時也不會分配堆,函數(shù)調(diào)用時也不會分配堆。堆的存儲空間是由程序員使用指令分配和釋放。堆和棧的共同點是動態(tài)存儲,處于這兩個區(qū)域的存儲單元可以隨時分配和釋放,呈現(xiàn)臨時性的特點。區(qū)別是分配方式不同,棧是編譯器根據(jù)程序代碼自動確定大小,到函數(shù)調(diào)用時由指令自動完成分配和釋放;堆則完全由程序員指定分配大小,何時分配,何時釋放,自行掌握分配和釋放時機,假如已經(jīng)釋放了還使用堆會產(chǎn)生引用錯誤,或者始終沒有釋放會產(chǎn)生內(nèi)存泄露。
內(nèi)存溢出:程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間可使用。你要求分配的內(nèi)存超出了系統(tǒng)能給你的。
內(nèi)存泄露:程序動態(tài)申請的堆內(nèi)存由于某種原因未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰。
- 靜態(tài)局部對象
在局部對象的前面加上static修飾
靜態(tài)局部對象和全局變量一樣按靜態(tài)存儲處理,即它的生命期與程序運行期相同,所有靜態(tài)局部對象可以將其值一直保持到程序結(jié)束或者下次修改。
靜態(tài)局部對象和全局對象的區(qū)別是它的作用域是塊作用域,只能在局部區(qū)域使用。靜態(tài)局部對象在還未調(diào)用函數(shù)前甚至是程序運行時就進行初始化了,所以每次調(diào)用時不會再有初始化操作。如果靜態(tài)局部對象定義時未賦初值,則用0填充。
當一個函數(shù)會被多次調(diào)用又希望它的某些值保持住時,就因該使用功能靜態(tài)局部對象。需要注意全局對象定義前加上static不是靜態(tài)的意思,全局本身已是靜態(tài),而是私有的意思,此時全局對象的作用域為該源文件。 - 程序組織結(jié)構(gòu)
- 內(nèi)部函數(shù)
函數(shù)本質(zhì)上是全局的,在函數(shù)定義前面加上static修飾,稱其為內(nèi)部函數(shù),僅在包含它的文件中可見。 - 外部函數(shù)
在函數(shù)定義前加上extern修飾,稱其為外部函數(shù),在調(diào)用另一個文件中的函數(shù)時,需要用extern聲明此函數(shù)是外部函數(shù),C++中所有的函數(shù)本質(zhì)上都是外部函數(shù),所有extern可以省略。