離港篇
引用
引用是變量的別名
引用不能單獨存在
基本數據類型的引用:
int x = 2;
int &b = x;
b = 10;
cout << x << endl; // 10
結構體類型的引用
typedef struct{
int x;
int y;
}Coor;
Coor c1;
Coor &c = c1;
c.x = 10;
c.y = 20;
cout << c1.x << c1.y; // 10 20
指針類型的引用
類型 *&指針引用名 = 指針;
int a = 10;
int *p = &a;
int *&q = p;
*q = 20;
cout << a << endl;
// 20
引用作函數參數
void fun(int &a,int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
int x = 10,y = 20;
fun(x,y);
const
int x = 3; //變量
變量名 | 存儲地址 | 存儲內容 |
---|---|---|
x | &x | 3 |
const int x = 3; // 常量
const 與 指針類型
const int *p = NULL;
int const *p = NULL;
// 上兩者完全等價
int * const p = NULL; // 此形式不同
// const 還可以加兩次:
const int * const p = NULL;
int const * const p = NULL;
// 上兩者完全等價
int x = 3;
const int *p = &x;
p = &y; // 正確
*p = 4; // 錯誤
因爲 const 修飾 *p,所以 *p 不可變
特殊記憶法:
一個比較好記的方法來區分 int const p與 int const p,把*讀作pointer to然後從後往前讀。
第一個int const *p就可以讀作 p is a pointer to const int,p是指向常量的指針
第二個int* const p就可以讀作 p is a const pointer to int,p是指向int型的常指針
int const * p 指 p 的指向可以變,但是 p 的指向的那個值的內容不能變
int * const p 指 p 的指向不可以變,但是 p 的指向的那個值的內容可變
const 與 引用
int x = 3;
const int &y = x;
x = 10; // 正確
y = 20; // 錯誤
C++ 函數新特性
函數參數默認值
void fun(int i,int j=5,int k=10);
// 在定義時不建議加上默認值,在聲明時加
void fun(int i,int j,int k) {
cout << i << j << k;
}
有默認值的參數必須在參數表的最右端
函數重載
在相同作用域內,名稱相同參數可辨
用同一函數名定義的多個函數,
參數個數和參數類型不同。
int getMax(int x,int y,int z)
{
// to do
}
double getMax(double x,double y)
{
// to do
}
如何實現重載?如上兩個函數在編譯後會變成
getMax_int_int_int
和 getMax_double_double
來區分兩個同名函數
內聯函數
編譯時將函數體代碼和實參代替函數調用語句,執行效率高
內聯函數關鍵字:inline
inline int getMax(int i,int j,int k);
內聯編譯是建議性的,由編譯器決定
邏輯簡單(甚至不能還有 循環),調用頻繁的函數建議使用內聯
遞歸函數無法使用內聯方式
C++內存管理
內存的本質:資源
操作系統掌控內存資源
我們只能 申請/歸還 內存資源
申請/歸還 內存資源就是內存管理
運算符:
- 申請內存 new
- 釋放內存 delete
內存的申請和釋放
申請內存:
int *p = new int;
釋放內存:
delete p;
塊內存的申請和釋放
int *arr = new int[10];
delete []arr;
內存操作注意事項
申請內存不一定能申請成功:
int *p = new int[1000];
if(NULL == p) {
// 內存分配失敗
}
釋放內存注意事項:
delete p; 或 delete[] p;
p = NULL;