5.引用VS指針
(1)作用:引用是給變量起一個別名;
(2)定義引用的一般格式:
類型 &引用名 = 變量名;
例如:
int a = 1;int &b = a; //b是的別名,因此a和b是同一個單元(PS:定義引用時一定要初始化,指明引用變量是誰的別名)
在實際應用中,引用一般用作參數傳遞與返回值。
(3)const引用是指向const對象的引用
const int ival = 1024; //const int& refval = ival; //正確int &ref2 = ival; //錯誤(4)函數傳參:按引用傳遞
引用傳遞方式是在函數定義時在形參前面加上引用運算符&;
例如:voidswap(int &a, int &b);
引用作為參數對形參的任何操作都能改變響應的實參數據,又使函數調用顯得方便、自然。
(5)引用可作為函數的返回值,放在賦值運算符左邊;
#include<iostream> using namespace std; int& func(int &num){ return num;} int main(){ int num=1; func(num)=7; cout<<"num = "<<num<<endl; return 0;}結果為:num = 7;
(6)引用與指針的區別
引用訪問一個變量是直接訪問,而指針是間接訪問;
引用是一個變量的別名,本身不單獨分配自己的內存空間,而指針有自己的內存空間;
引用一經初始化不能再引用其他變量,而指針可以重新指向其他變量。
(盡可能使用引用,不得已時使用指針)
6.函數升級
(1)內聯函數的使用
inline int add(int a, int b){ return a + b;}inline int add(int a, int b){
return a + b;
}
宏函數
#define ADD(a, b) a + b(2)內聯函數與宏函數的區別
內聯函數調用時,要求實參和形參的類型一致,另外內聯函數會先對實參表達式進行求值,然后傳遞給形參;而宏調用時只用實參簡單地替換形參。
內聯函數是在編譯的時候,在調用的地方將代碼展開,而宏則是在預處理時進行替換的;
在c++中最好用inline函數替代帶參數的宏。
(3)函數重載(overload)
定義:相同的作用域,如果兩個函數名稱相同,而參數不同,稱為重載(overload)
條件:編譯器通過檢查實際參數的個數、類型和順序確定相應的被調用函數。
name managling(名字改編):c++為了支持重載,會將相同的函數名根據形參的不同而改編成不同的名字加以識別。
實現c與c++混合編程:extern “C”
ifdef __cplusplusextern “C”{#endif……#ifndef __cplusplus}#endif帶默認形參值的函數:
函數沒有聲明時,在函數定義中指定形參的默認值;
函數既有定義又有聲明時,聲明指定后,定義時就不能再指定默認值;
默認值的定義必須遵守從右到左的順序,如果某個形參沒有默認值,則它左邊的參數就不能有默認值。
voidfunc(int a, double b = 4.2, int c= 3); //合法 voidfunc(int a = 3, double b, int c = 3); //不合法函數調用時,實參與形參按從左到右的順序進行匹配。
7.命名空間
(1)c語言 VS c++
c語言中所有的全局標識符共享同一個作用域,標識符之間可能發生沖突
c++中提出了命名空間的概念:
命名空間將全局作用域分成不同的部分;
不同命名空間中的標識符可以同名而不會發生沖突;
命名空間可以互相嵌套;
全局作用域也叫默認命名空間。
(2)如何定義命名空間
c++命名空間的定義:
namespace name{…}
namespace First{ int I = 0;}namespace Second{ int I = 1; namespaceInternal { struct p { int x; int y; }; }}(3)c++命名空間的使用
使用整個命名空間:using namespace name;
使用命名空間中的變量:using name::variable;
使用默認命名空間中的變量:::variable
示例:
#include<iostream> usingnamespacestd; namespaceFirst{ inti=1;}namespaceSecond{ inti=2; namespaceInternal { structmystruct { intx; inty; }; }} int main(){ usingnamespaceFirst; usingSecond::Internal::mystruct; cout<<"i = "<<i<<endl; cout<<"second i = "<<Second::i<<endl; mystructnode={3,4}; cout<<"node.x = "<<node.x<<endl; cout<<"node.y = "<<node.y<<endl; return0;}
新聞熱點
疑難解答
圖片精選