C++ 大學MOOC 北大課程(郭煒老師)聽課整理 第一週

引用

概念

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)只能從最右邊連續若干個參數缺省

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章