程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++學習-構造函數(3)

C++學習-構造函數(3)

編輯:C++入門知識

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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved