C++之函式的預設引數
文章目錄
前言
編譯工具:visual studio 2019
語言:C++
1.1 預設引數概念
預設引數是宣告或定義函式時為函式的引數指定一個預設值。在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。
例程1:
#include<iostream>
using namespace std;
void TestFunc1(int a = 0) {//引數預設值為0
cout << a << endl;
}
int main()
{
TestFunc1(); // 沒有傳參時,使用引數的預設值
TestFunc1(10); // 傳參時,使用指定的實參
}
執行結果:
例程1中,函式TestestFunc1的引數a屬於預設引數,預設值為0。如果在呼叫TestestFunc1函式時,沒有傳參,則使用預設引數0,如果有傳參,則使用指定的實參。
1.2 預設引數分類
1.2.1 全預設引數
全預設引數顧名思義就是函式的引數全部都屬於預設引數,顯然例程1中的TestFunc1函式的引數就屬於中的全預設引數。
#include<iostream>
using namespace std;
void TestFunc2(int a = 10, int b = 20, int c = 30) {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
cout << "不傳入引數" << endl;
TestFunc2();
cout << "傳入一個引數" << endl;
TestFunc2(1);
cout << "傳入兩個引數" << endl;
TestFunc2(1, 2);
cout << "傳入三個引數" << endl;
TestFunc2(1, 2, 3);
return 0;
}
執行結果:
呼叫全預設函式時,可以不用傳任何引數,如果傳入引數則預設從最左側開始賦值。比如例程2中,當傳入1個引數時,預設把引數傳遞給a;傳入2個引數時(1, 2),則賦值順序為:1傳遞給a、2傳遞給b;傳遞三個引數也是從最左側開始賦值,即a = 1、b = 2、c = 3。
1.2.2 半預設引數
半預設引數即函式的引數至少有一個引數沒有預設值。
例程3:
#include<iostream>
using namespace std;
void TestFunc3(int a, int b, int c = 30) {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
cout << "傳入兩個引數" << endl;
TestFunc3(1, 2);
cout << "傳入三個引數" << endl;
TestFunc3(1, 2, 3);
return 0;
}
執行結果:
例程3中,函式TestFunc3的兩個引數不具備預設值,所以呼叫時,至少要傳入兩個引數,否則會出錯。
1.3 預設引數使用注意事項
1.3.1 預設引數必須從右往左依次來給出,不能間隔著設定預設引數
比如對於TestFunc3函式,如果是以下兩種定義方式則會出錯:
錯誤1:沒有把預設引數放在最右側
void TestFunc3(int a = 10, int b, int c)
錯誤2:試圖間隔著設定預設引數
void TestFunc3(int a = 10, int b, int c = 30)
提示:如果你想把某個引數設定為預設引數,只需把該引數放在最右側就可以了。
1.3.2 預設引數不能在函式宣告和定義中同時出現
例如:
可以看到在定義函式TestFunc4時,由於宣告和定義中都出現了預設引數,在visual studio 2019編譯器中無法編譯通過。編譯器之所以這麼做是為了防止出現歧義,比如,當宣告與定義位置同時出現預設引數,而且恰巧兩個位置提供的值不同,那編譯器就無法確定到底該用哪個預設值。必須把宣告或定義中引數的預設值去掉一個,針對以上錯誤,程式可以更改如下。
修改1:去掉宣告中引數的預設值
1.//函式宣告
2.void TestFunc4(int a);
3.//函式定義
4.void TestFunc4(int a = 0) {
5. cout << "a = " << a << endl;
6.}
修改2:去掉定義中引數的預設值
1.//函式宣告
2.void TestFunc4(int a = 0);
3.//函式定義
4.void TestFunc4(int a) {
5. cout << "a = " << a << endl;
6.}
例程4:
#include<iostream>
using namespace std;
//函式宣告
void TestFunc4(int a);
//函式定義
void TestFunc4(int a = 0) {
cout << "a = " << a << endl;
}
int main()
{
TestFunc4();
return 0;
}
執行結果:
從例程4中可以看到,當去掉宣告中引數的預設值時,程式可以正常執行。
1.3.3 預設值必須是常量或者全域性變數
以上的程式中引數的預設值都是常量,下面舉一個預設值為全域性變數的例子。
例程5:
#include<iostream>
//#define MAX 100
using namespace std;
int Max = 100;
void TestFunc5(int score = Max) {
cout << "score = " << score << endl;
}
int main()
{
cout << "全域性變數作為預設值: ";
TestFunc5();
cout << "改變全域性變數的值: ";
Max = 150;
TestFunc5();
return 0;
}
執行結果:
例程5中,定義了一個全域性變數Max,並將其作為引數score的預設值。當我們改變全域性變數Max的值時,函式引數的預設值也跟著改變。
總結
本文講述了預設引數的相關知識點,首先介紹了預設引數的概念,並舉例說明了預設引數的分類,最後給出了預設引數的三個注意點。預設引數概念是函式過載的基礎,瞭解了預設引數的概念就可以去學習函式過載了。