引用
概念
1)定義方式:類型名 & 引用名=同類型的變量名
例如:
int t; int & n = t;
則定義了一個類型爲int& 的引用 名叫 r 其用變量t初始化 結果就是r引用了t。
2)某個變量的引用和這個變量是一回事 就是變量的別名
3)定義引用必須初始化 一般用變量進行初始化 也可以用引用初始化
引用一旦初始化 其就一直引用這個變量
引用只能引用變量
應用示範(交換函數swap())
1)在c語言中 我們可以使用指針來完成兩個變量之間的交換
void swap(int * a, int * b){
int tamp;
tamp = *a; *a = *b; *b = tamp;
}
int a, b;
swap(&a, &b);
2)而在C++中出現了引用 就可以
void swap(int &a, int &b){
int tamp;
tamp = a; a = b; b = tamp;
}
int a, b;
swap(a, b);
引用作爲函數返回值
示例代碼
int n;
int & Setvalue(){
return n;
}
Setvalue() = 40;
int & r = Setvalue();
如上 Setvalue()函數的返回值類型是引用,其用變量 n 來初始化,其結果就是Setvalue()函數返回值成爲了 n 的引用;
第5條代碼對Setvalue()函數的返回值進行賦值,其結果就是將變量 n 的值改爲了40;
第6條代碼定義了引用 r ,並用Setvalue()函數的返回值對其進行初始化,其結果就是 r 也成爲了 n 的引用;
常引用
1)定義引用時,在前加const關鍵字,即爲常引用,例如:
int n;
const int & r = n;
此處定義了常引用 r ,其類型爲const int &
2) 不能通過常引用修改其引用的變量
3)可以使用 T 或 T & 類型的變量或引用來初始化 const T & 類型的常引用
4)不可以使用常變量 const T 或常引用 const T & 來初始化引用 T &(除非強制類型轉換)
const關鍵字
常量
例如:
const int i = 23;
const string name = "peter";
常量指針
1)定義方式:const T * 指針名
2)不能通過常量指針修改其指向的內容(並不是說其指向的內容不能被修改)
例如:
int n,m;
const int * p=&n; //定義常量指針 p
*p=5;//試圖通過 p 來修改變量 n 編譯出錯
n=4;//但 n 可以被修改
p=&m;//常量指針可以變換指向
3)不能把常量指針賦值給非常量指針,反過來可以
4)常量指針作爲函數參數,可以避免在函數體內修改該指針指向的內容
例如:
void Myprintf(const char * p){
strcpy(p,"this");// 試圖在函數內部修改指針 p 指向的字符串 編譯出錯
printf("%s",p);// 沒有修改 編譯無錯
}
常引用
見上文
動態內存分配
用new運算符動態分配內存
分配出一個變量空間:
1)方式:T * p=new T;
2)T 爲任意類型名 p 爲 T *類型
3)系統將分配出一個大小爲 sizeof(T) 的內存空間,並將該空間的其實地址賦值給指針變量 p
例如:
int * p;
p = new int;
*p = 5;
分配出一個數組空間
1)方式:T * p=new T[N];
2)N爲要分配數組元素的個數
3)系統將分配出大小爲 sizeof(T)*N 的內存空間,並將該內存空間的起始地址賦值給指針變量 p
例如:
int * p;
int i=5;
p = new int[i];
p[0] = 5;
用delete運算符釋放動態分配的內存空間
1)new 出來的內存空間必須 delete 掉 方式:delete 指針名
2)delete 掉數組空間時要加 [ ] 方式: delete [] 指針名
例如:
int * p;
p = new int;
*p = 5;
delete p;
p = new int[10];
p[2] = 10;
delete[] p;
內聯函數、重載函數、函數參數缺省
內聯函數 inline
1)爲了避免出現反覆調用只有幾條語句函數而產生的過多時間開銷,引入內聯函數機制
2)調用內聯函數時,系統直接將函數代碼插入到調用語句處
例如:
inline max(int a, int b){
if (a > b)
return a;
else
return b;
}
函數重載
1)一個或多個函數若名字相同但參數表不同(參數類型,參數個數),則稱這些函數重載
2)調用名字相同的重載函數通過所給參數
例如:
int max(int a, int b){};//(1)
int max(int a, int b, int c){};//(2)
double max(double a, double b){};//(3)
max(2.3, 2.5);//調用(3)
max(2,3);//調用(1)
max(1,2,3);//調用(2)
函數參數缺省
1)當定義函數時,最右邊連續若干個參數有缺省值時。當調用函數,相應位置不寫參數,則爲缺省值
2)只能從最右邊連續若干個參數缺省