C++類/函式預設引數
阿新 • • 發佈:2018-11-17
一、成員函式引數的預設值是在聲明裡賦,還是在定義裡?
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 }
實踐證明,預設引數可以在定義中,也可以在宣告中,只要全域性的宣告和定義中只有一個帶引數即可
區域性的宣告中可以隨便改變預設引數(不管上述預設引數是在定義中還是在宣告中)。在下一次改變之前,此引數將一直生效,並將覆蓋全域性的申明。若要使用全域性的宣告預設引數,可以加“::”