1. 程式人生 > >【C++】 error C2572: 重定義預設引數

【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)定義所有引數都有預設值得建構函式。 

今天根據一個問題,舉一反三,又複習了其他兩個內容。。

已完。。