C++的函數重載(overload)

什麼是函數重載

在這裏插入圖片描述

Long i=10 隱式地把int類型的10轉化成long類型
Long i=(int)10 顯示轉換
只能小的轉大的,大的類型不能轉化爲小的類型
在這裏插入圖片描述
在這裏插入圖片描述

出現的原因——namemangling技術改變了函數名

在這裏插入圖片描述
利用反彙編查看區別
在這裏插入圖片描述
機器碼這裏16進製表示,2個16進制代表一個字節;內存是連續的;機器碼存儲在exe文件中,載入內存纔會有內存地址;
如display方法佔用了五個字節,call是調用的意思,調用的display(013c1429h)裏的是函數的內存地址
在這裏插入圖片描述

默認參數

◼ C++允許函數設置默認參數,在調用時可以根據情況省略實參。規則如下:

默認參數只能按照右到左的順序

在這裏插入圖片描述
要麼左右參數都有默認值,否則一個的話只能從右邊先開始賦默認值
在這裏插入圖片描述

如果函數同時有聲明、實現,默認參數只能放在函數聲明中

在這裏插入圖片描述

默認參數的值可以是常量、全局符號(全局變量、函數名)

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

默認參數的本質

#include <iostream>
using namespace std;
int sum(int v1, int v2) {
	return v1 + v2;
}
int main() {
	sum(1, 2);
	sum(3, 4);

	return 0;
}

這是在x64下調試的
在VS中調試後ctrl+f11,調出反彙編界面
sum(1, 2);
00007FF6A8AB186A mov edx,2
00007FF6A8AB186F mov ecx,1
00007FF6A8AB1874 call sum (07FF6A8AB1055h)
sum(3, 4);
00007FF6A8AB1879 mov edx,4
00007FF6A8AB187E mov ecx,3
00007FF6A8AB1883 call sum (07FF6A8AB1055h)
這是在x86下調試的
sum(1,2);
013E1EC8 push 2 //先將最右邊的push
013E1ECA push 1
013E1ECC call sum (013E1082h)
013E1ED1 add esp,8
sum(3, 4);
013E1ED4 push 4
sum(3, 4);
013E1ED6 push 3
013E1ED8 call sum (013E1082h)
013E1EDD add esp,8
有默認參數時,v2=2,sum(1)與sum(1,2)的比較
在這裏插入圖片描述
除去內存地址,只有紅色方框處不同
在這裏插入圖片描述

extern “C”

被extern "C"修飾的代碼會按照C語言的方式去編譯代碼
在這裏插入圖片描述

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