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