在學習c++的過程中學到了一些關於函數重載以及函數默認參數的一些知識,因此記錄下來,因爲筆者是初學者,如果有什麼錯誤請各位大佬斧正!
1.1 什麼是函數重載
函數重載是指在同一作用域內,可以有一組具有相同函數名,不同參數列表的函數,這組函數被稱爲重載函數。重載函數通常用來命名一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的污染,對於程序的可讀性有很大的好處。同時在參考其他大佬的文章中發現,即使是函數名相同以及函數的參數個數以及類型相同同樣可以形成函數重載,只需要對函數進行const/volatiles屬性進行限制。
1.2 函數重載的形式
在上文中介紹了c++函數重載的概念,對於函數重載來說以下形式就可以構成函數重載
1.函數參數類型不同:
void test1(int i)
{
cout << "這是int類型的參數" << i << endl;
}
void test1(string str)
{
cout << "這是string類型的參數" << str << endl;
}
2.函數參數個數不同:函數參數個數不同時也可視爲重載
void test1(int i,string str)
{
cout << "這是int類型的參數" << i << endl;
}
void test1(string str)
{
cout << "這是string類型的參數" << str << endl;
}
3.函數參數個數以及類型都不相同,代碼和上面類型就不再貼出。
4.函數使用const/volatiles屬性進行實現函數重載,代碼如下
struct test
{
int bar()const
{
return 2;
}
int bar()
{
return 3;
}
};
int main()
{
test a; #實例化test對象a
cout << a.bar() << endl;
const test b; # 實例化擁有const屬性的對象b
cout << b.bar() << endl;
getchar();
return 0;
}
輸入後發現內容爲3,2
通過輸出可以發現當對函數進行const限制時同樣可以實現函數重載。
1.3 函數重載與默認參數的衝突
當在類中同時使用函數重載以及默認參數時可能導致編譯器在匹配函數時發生歧義,最後拋出異常,下面看一個小案例。
void test(string str, int i = 1) {
cout << "有默認參數的函數" << endl;
}
void test(string str, int i) {
cout << "沒有默認參數的函數" << endl;
}
int main()
{
test("1111",1);
return 0;
}
上面這段代碼無法運行的,因爲當test函數在定義時如果指定了默認參數的話,當進行函數重載時就會照成二義性,例如下面調用的test(“1111”,1)。它既可以調用上面的帶有默認參數的test函數,同樣可以調用下面的test函數,導致程序無法運行,在函數重載以及默認參數同時存在時,如果發生歧義,建議保留默認參數。
總結
本來想通過一些反彙編代碼講函數重載的一些原理進行展示,無奈編譯器出了問題,以後有機會在進行展示。小白編程,大佬請多多指正,謝謝!