C++函式過載和引用
函式過載
在C語言中,函式不可以重複出現一個函式名,C語言中,一個函式名就是一個函式,是一對一的,C++也是一對一的,可是C++在後臺會根據傳的引數,等等資訊給函式重新命名,所以引數不同,呼叫的函式也不同,實現了過載但在C++是允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表(引數個數、型別、順序)必須不同。
- #include <iostream>
- int Add(int a, int b)
- {
- return a + b;
- }
- double Add(double a, double b)
- {
- return a + b;
- }
- long
- {
- return a + b;
- }
- int main()
- {
- Add(10, 30);
- Add(10.0, 30.0);
- Add(10L, 30L);
- return 0;
- }
那麼在C語言中為什麼不能實現函式的過載呢?
在C和C++環境中建立函式名為int Add(int a, int b)的函式,C++中生成的函式名如下圖所示,編譯器會對函式所在作用域中同一函式名的函式根據函式形參的型別和順序進行重新命名,因此每個函式看似名字相同,但其實都是有區別的。但在C語言中,程式碼通過編譯後,編譯器不會根據進行重新命名,只會簡單的給函式進行重新命名,這就是C不能實現函式過載的原因。
- Add(10, 30);
- 002B53AE push 1Eh
- 002B53B0 push 0Ah
- 002B53B2 call Add (02B1118h)
- 002B53B7 add esp,8
- Add(10.0, 30.0);
- 002B53BA sub esp,8
- 002B53BD movsd xmm0,mmword ptr ds:[2BCD90h]
- 002B53C5 movsd mmword ptr [esp],xmm0
- 002B53CA sub esp,8
- 002B53CD movsd xmm0,mmword ptr ds:[2BCD80h]
- 002B53D5 movsd mmword ptr [esp],xmm0
- 002B53DA call Add (02B1014h)
- 002B53DF fstp st(0)
- 002B53E1 add esp,10h
- Add(10L, 30L);
- 002B53E4 push 1Eh
- 002B53E6 push 0Ah
- 002B53E8 call Add (02B101Eh)
- 002B53ED add esp,8
引用
引用不是新定義的一個變數,而是給已存在的變數取了一個別名,編譯器不會為引用變數開闢記憶體空間,它和它的引用變數公用一塊記憶體空間。型別&引用變數名(物件名) = 引用實體,但型別必須和引用實體的型別相同。
引用的特性
引用在定義時必須初始化。
同時一旦引用了一個實體,再不能引用其他實體。
一個變數可以有多個引用。
使用場景
作為函式的形參
- void Add(int& a, int& b)
- {
- return a + b;
- }
作為函式的返回值
- int & TestRefReturn(int& a)
- {
- a += 10;
- return a;
- }
引用和指標的區別
相同點:
引用和指標在底層實現方式都是按照指標來實現的。
不同點:
引用是使用時必須要初始化,指標沒有要求初始化;
一個引用被初始化指向一個物件是就不能再指向其他物件,而指標可以在任何時候改變指向物件;
引用空(NULL)引用,但有空(NULL)指標;
引用sizeof()函式是結果為引用型別的大小,但指標的結果是地址*空間所佔位元組的個數;
引用自加改變變數的內容,指標自加改變指標的方向;
有多級指標,但沒有多級引用;
指標需要手動定址,但引用是通過編譯器實現定址;
引用比指標使用起來更安全。
為什麼引用比指標使用更安全?
在呼叫某一指標,指標不為空,但其指向的內容已經被刪除,這就可能會讓系統發生崩潰,但引用不會,引用永遠不可以為空,因此引用更為安全。