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