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