【C++】 error C2572: 重定義預設引數
前言
當debug時遇到這個錯誤C2572: “XXXX”: 重定義預設引數,往往是因為在函式的宣告和定義中同時給引數設定了預設值。想修改這個錯誤,你只需將函式的定義中的形參預設值部分刪除即可。(注:不是刪除形參,而是刪除預設值部分)例如以下這種情況,編譯器就會報錯;
Student(int a , char *n = "default name"); //函式宣告
Student::Student(int a, char *n = "default name" ) //函式定義
{
/*函式實現*/
}
修改後的程式碼如下;這樣程式就能正常運行了。
Student(int a , char *n = "default name"); //函式宣告
Student::Student(int a, char *n ) //函式定義
{
/*函式實現*/
}
問題分析
這個錯誤並不是什麼大問題,因為在寫程式碼的過程中,為了省事,大家都會習慣性的把函式的宣告直接貼上到函式的定義處。至於說為什麼不能在函式的宣告和定義處同時給形參以預設值,我查閱了一些書籍都沒有給出明確的解釋。大家只需記住即可。(OS:這根本就不算分析好嗎?)
我又好奇的想了一下,能不能在函式的宣告中不給予形參預設值,而在定義中給予預設值呢?所以我又試了一下。測試是在VS2013下進行的。測試結果是也可以執行。但是我又在另一種情況下進行了測試,發現無法執行。下面這種情況中就不可以,因為main() 函式呼叫func() 函式時,根據函式宣告,形參並沒有預設值,所以呼叫函式時,不能使用預設的引數值。
int func(int a);
void main()
{
int aa = func(5);
int bb = func(); //報錯
cout << aa<<" ";
cout << bb;
system("pause");
return;
}
int func(int a=3 )
{
a += a;
return a;
}
引申
再引申一下,在類中,如果你想定義一個建構函式,並且將某一建構函式中的所有形參都設定預設值,這樣做會發生什麼呢?
Student(){ age = 20; name = "default name"; } //不帶形參的預設建構函式 Student(int a = 20, char *n = "default name"); //形參有預設值的預設建構函式
答案是你使他變成了一個預設建構函式;
Student NI; //報錯,定義了多個預設建構函式
為什麼會變成預設建構函式呢?我們來看看上面的報錯:因為NI這個物件時沒有給定初始化引數,所以應該呼叫沒有引數的建構函式,也就是預設建構函式。而在第二個建構函式中所有的引數都有預設值,所以NI也能呼叫他,所以其實他也是預設建構函式,只是說這個預設建構函式也可以初始化帶資料的物件。這就是為什麼這兩種方式都是定義的預設建構函式的原因。
所以在C++中有兩種方式的預設建構函式
1)定義一個無引數的建構函式;
2)定義所有引數都有預設值得建構函式。
今天根據一個問題,舉一反三,又複習了其他兩個內容。。
已完。。