128:引用 引用就是某個(gè)對(duì)象的別名,其最主要作用是函數(shù)傳參。
//變量引用int val=1;int &refval=val;refval=2;cout<<val<<endl;//輸出2//常量引用const int val = 1;const int &ref1 = val; // 引用了一個(gè)一般常量const int &ref2 = 12; // 引用了一個(gè)字面常量//int &ref3 = val; // 錯(cuò)誤,常量必須要使用常量引用,ref3是個(gè)變量引用int var = 2;const int &ref2 = var; // 常量引用指向了一個(gè)變量 //ref2 = 3; // 不允許通過常量引用來做任何更改操作var = 3; // 但是可以用原始變量來更改內(nèi)容總結(jié)一下就是: 常量引用可以引用常量或者變量,但不能通過引用來更改其數(shù)據(jù)內(nèi)容; 變量引用只能引用變量,且用引用更改變量效果與直接更改變量一樣。 補(bǔ)充:非常量引用類型必須嚴(yán)格匹配,常量引用可以在內(nèi)置類型之間相互引用 129:枚舉 枚舉是一組可選常量值,既然是一組可選值說明包含多個(gè)常量。枚舉定義語法如下
enum val{val1 = 2, val2 = 4, val3} // 最后一個(gè)內(nèi)容沒有顯示給值等價(jià)于 val3 = 5如果不指定值默認(rèn)第一個(gè)值從0開始下一個(gè)依次+1遞增
枚舉的每一項(xiàng)都是一個(gè)唯一的const類型值,上面的定義有點(diǎn)類似于:
const val1 = 2; const val2 = 4; const val3 = 5;由于是const的,所以不允許更改。
枚舉項(xiàng)和int類型值有對(duì)應(yīng)關(guān)系,但是二者只能單向轉(zhuǎn)換,枚舉可以自動(dòng)轉(zhuǎn)成int,而int卻不能轉(zhuǎn)成枚舉
val a = val2 ; // 枚舉之間賦值初始化int b = val2 ; // 枚舉轉(zhuǎn)成int并初始化 val a = 2 ; // int 不能轉(zhuǎn)成枚舉,無法初始化130:#ifndef的使用 為防止頭文件重復(fù)包含所造成的編譯錯(cuò)誤,在定義頭文件時(shí),應(yīng)將頭文件置于#ifndef 和#endif中。格式如下:
#ifndef<頭文件名>#define<頭文件名>...頭文件代碼#endif;131:
char a[]{'a','b','c','/0'} ; // 第一種數(shù)組定義語法char a[] = “abc” ; // 第2種數(shù)組定義語法,數(shù)組大小為4char *a = “abc” ; // 指針表示法c風(fēng)格的字符串有多個(gè)操作函數(shù): strlen(), strcpy(),strcat()以及strcmp(),分別表示長度,拷貝,連接和比較。 132:指向常量的指針和常量指針
const int a = 123 ;const int *cur =&a ; //指向常量的指針需要注意:指向常量指針可以指向常量也可以指向變量,但無論如何都不能對(duì)它所指內(nèi)容做更改,即使它實(shí)際指向了變量,不過可以更改這個(gè)指針的指向
int c =456 ; cur = &c ; // 更改了指針的指向,現(xiàn)在指向的實(shí)際是個(gè)變量*cur = 789 ; // 不允許,雖然指向的是變量但系統(tǒng)認(rèn)為是常量所以不允許修改//常量指針const int a = 123 ;int b = 456 ;int *const cur1 = &a ; // 此時(shí)不允許允許 *cur = 789,因?yàn)橹赶蛄艘粋€(gè)常量int *const cur2 = &b ; // 此時(shí)允許允許 *cur = 789,因?yàn)橹赶蛄艘粋€(gè)變量cur1 = &b ; // 錯(cuò)誤,不允許更改指針的指向常量指針不能重新再做指向更改,但也許可以修改它指向的對(duì)象的值,這取決于它指向的值是變量還是常量。 另有指向常量的常量指針。 133:函數(shù)傳參 1)非引用傳參(值傳遞):函數(shù)內(nèi)部對(duì)參數(shù)的修改不會(huì)反映到函數(shù)外部。 2)引用傳參:函數(shù)內(nèi)部對(duì)參數(shù)的修改會(huì)反映到函數(shù)外部,當(dāng)參數(shù)比較大的時(shí)候,可以用引用傳參,可以避免拷貝參數(shù)時(shí)造成的大的開銷。 3)形參為指針:在函數(shù)內(nèi)對(duì)指針本身(地址,也即指向)進(jìn)行修改,不會(huì)影響到外部實(shí)參。但是對(duì)指針指向內(nèi)容進(jìn)行修改,會(huì)反映到外部實(shí)參。
void funct(int *i){ *i = 3; // 對(duì)指向內(nèi)容做更改 i = 0; // 對(duì)指針做更改}int it = 2;int *itPR = ⁢cout << itpr << *itpr << endl; // 輸出: 0040f9d8 2funct(itpr);cout << itpr << *itpr << endl; // 輸出: 0040f9d8 3但要注意的是,函數(shù)內(nèi)兩條語句的順序會(huì)影響到執(zhí)行結(jié)果。如下:
void funct1(int *i){ int k=10; i = &k; // 對(duì)指針做更改 *i = 0; // 對(duì)指向內(nèi)容做更改}此時(shí)反映到外部,函數(shù)執(zhí)行前后指針地址是一致的,指針指向值都為2。相當(dāng)于在funct1中重新定義了一個(gè)指針,與形參傳遞過來的指針指向不同的對(duì)象。 134:關(guān)于指針形參的交換函數(shù)
void swap_int_ptr_addr(int *a,int *b){ int *temp;//交換形參的地址,其結(jié)果和值傳遞一樣 temp=a;//只是指針的指向發(fā)生了變化,而地址中的值沒有變 a=b; b=temp;}void swap_int_ptr(int *a,int *b){ int temp;//交換形參的指針指向值,結(jié)果與引用傳遞相同 temp=*a;//修改指針?biāo)赶虻刂分械闹? *a=*b; *b=temp;}void swap_int_ptr_1(int *a,int *b)//錯(cuò)誤{ int *temp;//沒有分配內(nèi)存 *temp=*a;//將在拷貝時(shí)隨機(jī)分配一個(gè)地址 *a=*b; *b=*temp;}135:內(nèi)聯(lián)函數(shù):在編譯期間會(huì)在函數(shù)調(diào)用處直接用內(nèi)聯(lián)函數(shù)語句代替的一種函數(shù),要求函數(shù)語句必須簡單短小。內(nèi)聯(lián)函數(shù)有較好的性能,因?yàn)楹瘮?shù)在調(diào)用時(shí)系統(tǒng)剛要分配棧空間,內(nèi)聯(lián)函數(shù)會(huì)直接展開代碼,所以不會(huì)有棧空間分配步驟。其特點(diǎn)決定了,若修改內(nèi)聯(lián)函數(shù),就需要對(duì)所有用到內(nèi)聯(lián)函數(shù)的地方重新編譯。 136:函數(shù)重載 函數(shù)重載是指返回類型相同,函數(shù)名相同但參數(shù)不完全相同的多個(gè)函數(shù)。函數(shù)調(diào)用時(shí)會(huì)根據(jù)傳遞的參數(shù)類型和個(gè)數(shù)尋找最合適的重載函數(shù)。 不但參數(shù)類型和個(gè)數(shù)可以作為重載依據(jù),當(dāng)形參數(shù)是引用或指針時(shí) const 可用作重載依據(jù)。const引用或const指針形參只能用const對(duì)象初始化,而當(dāng)沒有普通引用函數(shù)時(shí),普通變量也可以使用形參為const引用函數(shù)。 137:IO對(duì)象無法復(fù)制或者賦值,所以IO對(duì)象作為函數(shù)形參或返回值時(shí)只能使用指針或引用。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注