C++規定:構造函數必須與相應的類同名,它可以帶參數,也可以不帶參數,與一般的成員函數定義相同,而且可以重載,構造函數的重載跟普通的成員函數的重載是一樣的。
一.構造函數的重載
[cpp] /*構造函數的重載*/
#include <iostream>
using namespace std;
class CDate
{
public:
CDate();
CDate(int day);
CDate(int month, int day);
CDate(int year, int month, int day);
~CDate();
void printInfo() const;
private:
int mYear;
int mMonth;
int mDay;
};
CDate::CDate()
{
cout << "調用構造函數1" << endl;
mYear = 2012;
mMonth = 2;
mDay = 10;
}
CDate::CDate(int day)
{
cout << "調用構造函數2" << endl;
mYear = 2012;
mMonth = 2;
mDay = day;
}
CDate::CDate(int month, int day)
{
cout << "調用構造函數3" << endl;
mYear = 2012;
mMonth = month;
mDay = day;
}
CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數4" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
CDate::~CDate()
{
cout << "調用默認析構函數" << endl;
}
void CDate::printInfo() const
{
cout << "Date: "
<< mYear << "年"
<< mMonth << "月"
<< mDay << "日"
<< endl << endl;
}
int main()
{
CDate day1;
day1.printInfo();
CDate day2(12);
day2.printInfo();
CDate day3(2, 14);
day3.printInfo();
CDate day4(2012, 2, 20);
day4.printInfo();
return 0;
}
/*構造函數的重載 www.2cto.com */
#include <iostream>
using namespace std;
class CDate
{
public:
CDate();
CDate(int day);
CDate(int month, int day);
CDate(int year, int month, int day);
~CDate();
void printInfo() const;
private:
int mYear;
int mMonth;
int mDay;
};
CDate::CDate()
{
cout << "調用構造函數1" << endl;
mYear = 2012;
mMonth = 2;
mDay = 10;
}
CDate::CDate(int day)
{
cout << "調用構造函數2" << endl;
mYear = 2012;
mMonth = 2;
mDay = day;
}
CDate::CDate(int month, int day)
{
cout << "調用構造函數3" << endl;
mYear = 2012;
mMonth = month;
mDay = day;
}
CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數4" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
CDate::~CDate()
{
cout << "調用默認析構函數" << endl;
}
void CDate::printInfo() const
{
cout << "Date: "
<< mYear << "年"
<< mMonth << "月"
<< mDay << "日"
<< endl << endl;
}
int main()
{
CDate day1;
day1.printInfo();
CDate day2(12);
day2.printInfo();
CDate day3(2, 14);
day3.printInfo();
CDate day4(2012, 2, 20);
day4.printInfo();
return 0;
}
執行結果:
[plain] 調用構造函數1
Date: 2012年2月10日
調用構造函數2
Date: 2012年2月12日
調用構造函數3
Date: 2012年2月14日
調用構造函數4
Date: 2012年2月20日
調用默認析構函數
調用默認析構函數
調用默認析構函數
調用默認析構函數
調用構造函數1
Date: 2012年2月10日
調用構造函數2
Date: 2012年2月12日
調用構造函數3
Date: 2012年2月14日
調用構造函數4
Date: 2012年2月20日
調用默認析構函數
調用默認析構函數
調用默認析構函數
調用默認析構函數
上面的例子使用了:void printInfo() const;
const在這裡的作用是,保證在printInfo函數體中,不更改變量的值,若不小心設置了某變量的值,編譯器會在編譯的第一時間提醒用戶程序出錯,提高了開發效率。
二.帶默認參數的構造函數
構造函數與成員函數,都可以設置形參的默認參數。如果構造函數或成員函數在類中的聲明初始化了默認參數,那麼在類外定義的時候,形參不能寫出默認值,具體看以下例子。
[cpp] /*帶默認參數的構造函數*/
#include <iostream>
using namespace std;
class CDate
{
public:
CDate(int year, int month = 2, int day = 8);
~CDate();
void printInfo() const;
private:
int mYear;
int mMonth;
int mDay;
};
CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
CDate::~CDate()
{
cout << "調用默認析構函數" << endl;
}
void CDate::printInfo() const
{
cout << "Date: "
<< mYear << "年"
<< mMonth << "月"
<< mDay << "日"
<< endl << endl;
}
int main()
{
CDate day1(2012);
day1.printInfo();
CDate day2(2012, 3, 15);
day2.printInfo();
return 0;
}
/*帶默認參數的構造函數*/
#include <iostream>
using namespace std;
class CDate
{
public:
CDate(int year, int month = 2, int day = 8);
~CDate();
void printInfo() const;
private:
int mYear;
int mMonth;
int mDay;
};
CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
CDate::~CDate()
{
cout << "調用默認析構函數" << endl;
}
void CDate::printInfo() const
{
cout << "Date: "
<< mYear << "年"
<< mMonth << "月"
<< mDay << "日"
<< endl << endl;
}
int main()
{
CDate day1(2012);
day1.printInfo();
CDate day2(2012, 3, 15);
day2.printInfo();
return 0;
}
執行結果:
[plain] 調用構造函數
Date: 2012年2月8日
調用構造函數
Date: 2012年3月15日
調用默認析構函數
調用默認析構函數
調用構造函數
Date: 2012年2月8日
調用構造函數
Date: 2012年3月15日
調用默認析構函數
調用默認析構函數
(1).上面的例子是用了:CDate(int year, int month = 2, int day = 8);
被設置默認參數的形參都是靠後面的參數,那如果是:CDate(int year=2012, int month = 2, int day);這樣可以嗎?
經過編譯器驗證,這樣聲明是錯誤的。在聲明一個對象時,一般都會省略後面的參數,而不會省略靠前面的參數,不然就亂套了。所以從這裡可以得出一個概念:在構造函數或成員函數中,被設置默認參數的形參,後面絕對不允許出現沒有設置默認參數的形參。
以CDate(int year, int month = 2, int day = 8)為例,設置默認參數有以下幾種情況:
1.全部給形參設置默認參數
CDate(int year=2012, int month = 2, int day = 8); 正確
2.給一部分形參設置默認參數
CDate(int year, int month = 2, int day = 8); 正確
CDate(int year, int month, int day = 8); 正確
有且只有這3種情況出現,比如以下聲明均是錯誤的:
CDate(int year, int month = 2, int day); 錯誤
CDate(int year=2012, int month = 2, int day); 錯誤
(2).帶默認參數的函數的定義
1.構造函數的聲明與定義分開,在類中聲明:
CDate(int year, int month = 2, int day = 8);
在類外定義:
[cpp] CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
CDate::CDate(int year, int month, int day)
{
cout << "調用構造函數" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
在函數定義的時候,那些默認參數就不必寫出來了。
2.在類中聲明與定義
如果直接在類中聲明並定義帶默認參數的構造函數,直接定義:
[cpp] CDate(int year, int month = 2, int day = 8)
{
cout << "調用構造函數" << endl;
mYear = year;
mMonth = month;
mDay = day;
}
摘自 gzshun的專欄