1. 程式人生 > >C++類/函式預設引數

C++類/函式預設引數

一、成員函式引數的預設值是在聲明裡賦,還是在定義裡?

class CAbc
{
  public:
        static int m_abc;
        CAbc(){}
        static void set(int abc);
        int fn(int a,int b=0,int c=5);
        //int fn(int a,int b,int c);
};
void CAbc::set(int abc)
{
        m_abc=abc;
}
//int CAbc::fn(int a,int b=0,int c=5)
//redefinition of default parameter : parameter 3
int CAbc::fn(int a,int b,int c)
{
        cout<<a << b << c << endl;
        return a;
}

int CAbc::m_abc=1000;
int main(int argc, char* argv[])
{
        CAbc a;
        a.fn(6);
        a.set(10);
        return 0;
}

宣告是使用者可以看到的部分,客戶非常信任地使用這個特性,希望得到一定的結果,但是你在實現裡使用了不同的預設值,那麼將是災難性的。因此編譯器禁止宣告和定義時同時定義預設引數值。
類的成員函式的引數表在宣告時預設引數位於引數表右部,如int fn(int a,int b=0,int c=5)之類的,但在它定義的時候則不能加預設引數,只能寫int fn(int a,int b,int c);
若宣告時沒有定義預設引數值,那麼在定義成員函式時可以定義預設引數值。但這種情況通常使用者是看不見的,因此應避免。
對於非類中的函式,在函式宣告中定義預設引數的另外一個好處時,可以利用宣告來隨意更改預設引數的值。

//int fglobal(int a,int b=2,int c=5)
//redefinition of default parameter : parameter 3
int fglobal(int a,int b,int c)
{
    cout<<a << b <<c<< endl;
    return a;
}
int fglobal(int a,int b=2,int c=5); // 全域性的申明
int CAbc::m_abc=1000;
int main(int argc, char* argv[])
{
    CAbc a;
    a.fn();
   //fglobal(); //此時用的全域性申明,無第一個引數不行
   fglobal(1);
    int fglobal(int a=2,int b=3,int c=5);  // 區域性的申明,不管上述預設引數是在定義還是申明中
    fglobal();
    ::fglobal(3); // 此時將採用全域性申明
    return 0;
}
//205
//125
//235
//325
}

實踐證明,預設引數可以在定義中,也可以在宣告中,只要全域性的宣告和定義中只有一個帶引數即可
區域性的宣告中可以隨便改變預設引數(不管上述預設引數是在定義中還是在宣告中)。在下一次改變之前,此引數將一直生效,並將覆蓋全域性的申明。若要使用全域性的宣告預設引數,可以加“::”

參考:https://www.cnblogs.com/zhangyz/articles/6383683.html