C++深度剖析教程7 --- 函數參數的擴展

學習交流可以添加

微信讀者交流①羣 (添加微信:coderAllen,備註加羣)
程序員技術QQ交流①羣:736386324

C++教程所有源碼地址:
https://github.com/lkk789/C-Learn-Source-code


1.函數參數的默認值
c++可以在函數聲明時爲參數提供一個默認值
當函數調用時沒有提供參數的值,則使用默認值
在這裏插入圖片描述

參數的默認值必須在函數聲明中指定

問題:函數定義中是否可以出現參數的默認值?
當函數聲明和定義中的參數默認值不同時會發生什麼?
在這裏插入圖片描述

7-1 默認參數值實驗

#include <stdio.h>

int mul(int x = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", mul());  //默認值爲0,C語言會編譯錯誤,c++對C語言的擴展
    printf("%d\n", mul(-1));
    printf("%d\n", mul(2));
    
    return 0;
}

int mul(int x)  //這裏不能賦值,c++是強類型語言,對參數,默認值的檢查很嚴格
{
    return x * x;
}

在這裏插入圖片描述

2.函數默認參數的規則
參數的默認值必須從右向左提供(設置)
函數調用時使用了默認值,則後續參數必須使用默認值(調用,匹配從左向右)

在這裏插入圖片描述

7-2 默認參數的錯誤示例

#include <stdio.h>

int add(int x, int y = 0, int z = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", add(1));
    printf("%d\n", add(1, 2));
    printf("%d\n", add(1, 2, 3));
    
    return 0;
}

int add(int x, int y, int z)
{
    return x + y + z;
}

在這裏插入圖片描述

3.函數佔位參數
在C++中可以爲函數提供佔位參數
佔位參數只有參數類型聲明,而沒有參數名聲明
一般情況下,在函數體內部無法使用佔位參數
在這裏插入圖片描述

目的是兼容C語言的
右邊的纔是不接受參數,左邊是佔位,是可以接受的
C語言是不等價的,c++是等價的

函數佔位參數的意義
佔位參數與默認參數結合起來使用
兼容C語言程序中可能出現的不規範寫法
下面的兩種聲明方式等價嗎?C中不等價,C++等價
void func(); <–> void func(void);

下面兩段代碼在移植過程中的改寫
test.c

#include <stdio.h>
void func()
{
}
int main(int argc, char *argv[])
{
    func();   
    func(1,2);
    return 0;
}

test.cpp

#include <stdio.h>
void func(int = 0, int = 0 )
{
}
int main(int argc, char *argv[])
{
    func();   
    func(1,2);
    return 0;
}

7-3 佔位參數與默認參數值
避免bug的方法

#include <stdio.h>

int func(int x, int = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", func(1));
    printf("%d\n", func(2, 3));
    
    return 0;
}

int func(int x, int)
{
    return x;
}

在這裏插入圖片描述

小結
C++中支持函數參數的默認值
如果函數調用時沒有提供參數值,則使用默認值
參數的默認值必須從右向左提供
函數調用時使用了默認值,則後續參數必須使用默認值
C++中支持佔位參數,用於兼容C語言中的不規範寫法

發佈了334 篇原創文章 · 獲贊 892 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章