水平綜合輔導(dǎo):談?wù)刢++的初始化工作(上)

字號:

c++博大精深,這是很多了解c++的人的感覺。越是深入,越是覺得她會給你很好的訓(xùn)練---讓你成為真正的程序設(shè)計者。
    我想從她的初始化工作著手,試圖展現(xiàn)其一角,希望能有助于您提高學(xué)c++和程序設(shè)計的興趣---然后,去發(fā)現(xiàn)、開拓吧,當(dāng)你把你的智慧融入進去以后,一行行程序就不僅是程序了,因為它就有了生命。
    關(guān)于c中的初始化相關(guān)部分,如指針,如全局變量與局部變量默認初始化的區(qū)別,如靜態(tài)變量的默認初始化,就跳過。我們從類開始。
    初始化是非常重要的工作,因為你的類(確切說是對象,程序)的執(zhí)行過程就是一系列狀態(tài)變換,而初態(tài)不正確,就不可能到達正確解了。
    面向?qū)ο蟮腸++中的初始化工作,是由構(gòu)造函數(shù)來完成的,在其他場景可能稱為構(gòu)造器。這是大家都明白的。但是,展開來,或許您還未必清楚,如,如何設(shè)計好的默認初始化,哪些成員變量只有的初始化形式,組合與繼承的初始化,資源淺拷貝問題,無名對象的問題,特殊需要的初始化(實例對象須化)等等。我將在vc7.0上調(diào)試程序,每次調(diào)試一個,談一個問題,試圖給您解釋清楚。愿于您有所幫助。
    這次就說說好的初始化過程與靜態(tài)成員的初始化。
    不管程序員如何,面向?qū)ο蟮腸++中初始化工作是必須的??!你寫了一個類,沒有寫構(gòu)造函數(shù),但是,系統(tǒng)會“暗暗的”給你一個系統(tǒng)默認的構(gòu)造函數(shù),在實例化對象的時候它就會工作---要知道,一旦你自己定義了構(gòu)造函數(shù),系統(tǒng)就不會再提供默認構(gòu)造函數(shù)。
    問題是,我們應(yīng)該定義自己的構(gòu)造函數(shù)。否則,系統(tǒng)多半是無法達到正確的初始狀態(tài)的!
    定義好的構(gòu)造函數(shù),應(yīng)該是給出多版本的構(gòu)造函數(shù),作好安全檢查工作。我們下面給出一個例子,由c++的例子改動邇來。
    需要一個類,日期Date,它有成員變量day,month,year,執(zhí)行一些相關(guān)操作。如何進行初始化工作?我們或許會見到下面的代碼:
    //...
    class Date {
    int d,m,y;
    public:
    Date(int dd=0,int mm=0,int yy=0)
    {
    d=dd;
    m=mm;
    y=yy;
    }
    //...
    };
    //...
    這樣的程序沒有語法錯誤,可以工作,但不是正確工作。下面這個語句會怎么樣呢?
    Date oneday(-2,10,2002);
    作簡單的檢查,如下面的代碼部分。也是于事無補的。如對下面的語句仍然是無能為力的:
    Date oneday(29,2,1981);
    //...
    class Date {
    int d,m,y;
    public:
    Date(int dd=0,int mm=0,int yy=0)
    {
    if(dd>=0&&yy>=0&&mm>=0&&m<=31){//
    d=dd;
    m=mm;
    y=yy;
    }
    //else
    }
    //...
    };
    //...
    更何況,我們可能會需要用string來初始化,用char *指針來初始化:
    string s="29/2/1981";
    char *p="29/2/1981";
    應(yīng)該怎么辦呢?我想你有必要好好審視你的初始化工作了?。?!
    我們來看一個設(shè)計實例:
    /////////////////////////////////////
    //類Date(c++)
    // 用于初始化工作的例子,寫于22/5/2003
    ///////////////////////////////////////////////////////////////
    //date.h
    #pragma once
    #include
    using namespace std;
    enum Month{jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};
    class Date
    {
    //異常類(默認構(gòu)造函數(shù),因為我們只是拋出異常,甚至沒有標(biāo)志)
    class Bad_date{};
    int d,y;
    Month m;
    //靜態(tài)成員變量
    static Date default_date;
    public:
    Date(int dd=0, Month mm=Month(0), int yy=0);
    Date(string s) { /* 省去內(nèi)容*/}
    Date(char *p) { /*省去內(nèi)容*/}
    ~Date(void);
    static void set_default(int d, Month m, int y);
    int day(void) const;
    Month month(void) const;
    int year(void) const;
    int leapyear(int y) { /*省去內(nèi)容*/ return 0;}
    //...
    void Test(void);
    };