初學(xué)者編程入門:C++學(xué)習(xí)實用技巧講解

字號:

在準(zhǔn)標(biāo)準(zhǔn)C++中,有關(guān)缺省變量值的限制非常模糊。基于此,很多編譯器允許開發(fā)人員將缺省變量值包含在函數(shù)聲明,指向函數(shù)的指針和引用,成員函數(shù)的指針,以及typedef聲明中。
    請看一下以下的程序:
    struct A
    {
    void func(int x=5)
    {
    }
    };
    void g(int n=12)
    {
    }
    // 根據(jù)C++標(biāo)準(zhǔn),不能在以下聲明中使用缺省變量值。
    void (*pf)(inti=120);
    void (A::*pmf)(int j=50);
    typedef void (*PF)(inti=100);
    // 函數(shù)的引用
    typedef void (&PRF)(inti=100);
    int main()
    {
    pf=g;
    PF pf2=g;
    pmf=&A::func;
    A a;
    //這些調(diào)用使用了哪些缺省值?
    pf();
    pf2();
    (a.*pmf)();
    }
    A::func()和g()具有缺省變量值,這是合理的。然而,指針pmf,pf以及typedefPF也定義了缺省的變量值。根據(jù)C++標(biāo)準(zhǔn),這是不規(guī)范的。
    這一代碼的實際使用中,其中的一個問題是這些聲明中提供的缺省值與A::func()和g()函數(shù)提供的值不一致。也就是說,很多編譯器將這些代碼作為非標(biāo)準(zhǔn)的擴展。當(dāng)調(diào)用g()函數(shù)時,我的編譯將120作為pf的缺省值;然而,對于pf2,它使用100作為它的缺省值。
    作為一種規(guī)則,應(yīng)該避免使用指向函數(shù)的指針,成員函數(shù)的指針,以及typedef命名的缺省變量值。即使你的編譯器接受了它們,在更高版本中它也可能不被接受。而且,這些代碼也會降低程序的靈巧性,也會給那些無法判別哪些編譯器接收何種缺省變量的開發(fā)人員帶來誤導(dǎo)。在使用這些缺省變量值的合法代碼中,這里的建議是添加一些必要的注釋,以說明需要哪些缺省變量值。