1. 程式人生 > 其它 >C++之函式的預設引數

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 例程1執行結果

  例程1中,函式TestestFunc1的引數a屬於預設引數,預設值為0。如果在呼叫TestestFunc1函式時,沒有傳參,則使用預設引數0,如果有傳參,則使用指定的實參。


1.2 預設引數分類

1.2.1 全預設引數

  全預設引數顧名思義就是函式的引數全部都屬於預設引數,顯然例程1中的TestFunc1函式的引數就屬於中的全預設引數。

  例程2:

#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 例程2執行結果

  呼叫全預設函式時,可以不用傳任何引數,如果傳入引數則預設從最左側開始賦值。比如例程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 例程3執行結果

  例程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 例程4的執行結果

  從例程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 例程5的執行結果

  例程5中,定義了一個全域性變數Max,並將其作為引數score的預設值。當我們改變全域性變數Max的值時,函式引數的預設值也跟著改變。


總結

  本文講述了預設引數的相關知識點,首先介紹了預設引數的概念,並舉例說明了預設引數的分類,最後給出了預設引數的三個注意點。預設引數概念是函式過載的基礎,瞭解了預設引數的概念就可以去學習函式過載了。