C++函數參數的擴展

在C語言中,如果函數沒有參數,那麼則意味着在調用該函數時,接受任意多的參數。在C++中,對函數參數進行一些擴展。
在C++中,在函數聲明時,能夠爲函數提供默認參數。因此,在調用函數時,如果,沒有提供參數值,則函數使用默認值。舉例代碼以下:ide

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num ){

    return num * num;
}

那麼輸出結果爲:
C++函數參數的擴展
在這段代碼中,在調用函數時,並無爲函數提供實參,因此,該函數使用默認值,因此sum的輸出結果爲0。
既然C++對函數參數進行了擴展,能夠對參數設置默認值。那麼,由此而引來的問題就是,既然能夠在函數聲明時指定默認值,是否能夠在函數調用時也指定默認值?第二個問題,若是能夠在函數定義時也指定默認值,那麼若是在函數聲明時和函數定義時所指定的默認值不同,又會出現什麼狀況?
如今,咱們能夠先來實驗一下第一個問題,函數定義時也指定默認值。函數

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num = 0 ){

    return num * num;
}

這段代碼中,咱們在函數定義的地方也指定了默認值,那麼,調試程序出現了這樣的問題,
C++函數參數的擴展
很明顯,程序報錯了。因此,這也就意味着咱們並不能在函數定義時指定函數的默認值。
那麼,如果,函數定義時和函數聲明時所設置的默認值不同會出現什麼狀況呢?在實驗以前,咱們經過猜測就能夠知道,程序必定報錯,由於,程序不接受在函數定義時設置參數默認值,更不要說參數值不同了。那麼,接下來,用程序驗證一下:3d

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num = 4 ){

    return num * num;
}

上面這段代碼,在函數聲明與定義時,咱們設置了不一樣的默認值值,那麼運行結果以下:
C++函數參數的擴展
很明顯,程序再次報錯了。
因此,若是咱們要提供函數的默認值,那麼必須:在函數聲明時提供函數的默認值。而且,在調用函數時如果沒有爲函數提供參數值,則函數使用默認值
接下來,總結一下函數默認參數的規則。
第一條,參數的默認值必須從右向左提供。調試

#include <stdio.h>
#include <stdlib.h>

//int add ( int x, int y = 1, int z = 2 );
int add ( int x, int y = 0, int z );  //error 函數提供默認值要從右向左考慮

int main ( int argc, char** argv ){

    printf ( "value = %d\n", add ( 1 ) );
    //printf ( "value = %d\n", add ( 1, 2 ) );
    //printf ( "value = %d\n", add ( 1, 2, 3 ) );

    system ( "pause" );
    return 0;
}

int add ( int x, int y, int z ){

    return x + y + z;
}

上面這段代碼中,咱們沒有爲第一個參數提供默認值,爲第二個參數提供了默認值,沒有爲第三個參數提供默認值,咱們看一下代碼運行結果:
C++函數參數的擴展
發現,程序報錯了。爲何呢?顯然,它違反了第一條規則,參數的默認值必須從右向左提供,顯然,上述代碼違背了這條規則。它並無爲最右邊的參數提供默認參數,反而爲第二個參數提供了默認值,因此,這樣作,確定是錯的。
那麼如今,咱們來正確的從右向左對函數參數提供默認值。code

#include <stdio.h>
#include <stdlib.h>

int add ( int x, int y = 1, int z = 2 );
//int add ( int x, int y = 0, int z );  //error 函數提供默認值要從右向左考慮

int main ( int argc, char** argv ){

    printf ( "value = %d\n", add ( 1 ) );
    //printf ( "value = %d\n", add ( 1, 2 ) );
    //printf ( "value = %d\n", add ( 1, 2, 3 ) );

    system ( "pause" );
    return 0;
}

int add ( int x, int y, int z ){

    return x + y + z;
}

運行以後咱們發現結果是正確的。
C++函數參數的擴展
第二條,函數調用時使用了默認值,則後續參數必須使用默認值。
C++中還新增量一個新的概念,叫作佔位參數。由於,C++爲了兼容C語言,也就是說,僅僅作很小的改動,就能讓本來在C上運行的程序,在C++下也能跑起來。爲此,佔位參數的概念就提出來了。那麼什麼是佔位參數呢?就是說,僅僅聲明參數類型,卻沒有參數名的聲明。並且,通常狀況下,在函數內部沒法使用佔位參數。blog

#include <stdio.h>
#include <stdlib.h>

int func ( int x, int ){

    return x;
}

int main ( int argc, char** argv ){

    printf ( "func ( int x, int ) = %d\n", func ( 1, 2 ) );

    system ( "pause" );
    return 0;
}

上面這段代碼就使用了佔位參數,運行結果以下:
C++函數參數的擴展it

相關文章
相關標籤/搜索