c++博大精深,這是很多了解c++的人的感覺。越是深入,越是覺得她會(huì)給你很好的訓(xùn)練---讓你成為真正的程序設(shè)計(jì)者。
我想從她的初始化工作著手,試圖展現(xiàn)其一角,希望能有助于您提高學(xué)c++和程序設(shè)計(jì)的興趣---然后,去發(fā)現(xiàn)、開拓吧,當(dāng)你把你的智慧融入進(jìn)去以后,一行行程序就不僅是程序了,因?yàn)樗陀辛松?BR> 關(guān)于c中的初始化相關(guān)部分,如指針,如全局變量與局部變量默認(rèn)初始化的區(qū)別,如靜態(tài)變量的默認(rèn)初始化,就跳過。我們從類開始。
初始化是非常重要的工作,因?yàn)槟愕念悾ù_切說是對(duì)象,程序)的執(zhí)行過程就是一系列狀態(tài)變換,而初態(tài)不正確,就不可能到達(dá)正確解了。
面向?qū)ο蟮腸++中的初始化工作,是由構(gòu)造函數(shù)來完成的,在其他場(chǎng)景可能稱為構(gòu)造器。這是大家都明白的。但是,展開來,或許您還未必清楚,如,如何設(shè)計(jì)好的默認(rèn)初始化,哪些成員變量只有的初始化形式,組合與繼承的初始化,資源淺拷貝問題,無名對(duì)象的問題,特殊需要的初始化(實(shí)例對(duì)象須化)等等。我將在vc7.0上調(diào)試程序,每次調(diào)試一個(gè),談一個(gè)問題,試圖給您解釋清楚。愿于您有所幫助。
這次就說說好的初始化過程與靜態(tài)成員的初始化。
不管程序員如何,面向?qū)ο蟮腸++中初始化工作是必須的??!你寫了一個(gè)類,沒有寫構(gòu)造函數(shù),但是,系統(tǒng)會(huì)“暗暗的”給你一個(gè)系統(tǒng)默認(rèn)的構(gòu)造函數(shù),在實(shí)例化對(duì)象的時(shí)候它就會(huì)工作---要知道,一旦你自己定義了構(gòu)造函數(shù),系統(tǒng)就不會(huì)再提供默認(rèn)構(gòu)造函數(shù)。
問題是,我們應(yīng)該定義自己的構(gòu)造函數(shù)。否則,系統(tǒng)多半是無法達(dá)到正確的初始狀態(tài)的!
定義好的構(gòu)造函數(shù),應(yīng)該是給出多版本的構(gòu)造函數(shù),作好安全檢查工作。我們下面給出一個(gè)例子,由c++的例子改動(dòng)邇來。
需要一個(gè)類,日期Date,它有成員變量day,month,year,執(zhí)行一些相關(guān)操作。如何進(jìn)行初始化工作?我們或許會(huì)見到下面的代碼:
//...
class Date {
int d,m,y;
public:
Date(int dd=0,int mm=0,int yy=0)
{
d=dd;
m=mm;
y=yy;
}
//...
};
//...
這樣的程序沒有語法錯(cuò)誤,可以工作,但不是正確工作。下面這個(gè)語句會(huì)怎么樣呢?
Date oneday(-2,10,2002);
作簡(jiǎn)單的檢查,如下面的代碼部分。也是于事無補(bǔ)的。如對(duì)下面的語句仍然是無能為力的:
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
}
//...
};
//...
更何況,我們可能會(huì)需要用string來初始化,用char *指針來初始化:
string s="29/2/1981";
char *p="29/2/1981";
我想從她的初始化工作著手,試圖展現(xiàn)其一角,希望能有助于您提高學(xué)c++和程序設(shè)計(jì)的興趣---然后,去發(fā)現(xiàn)、開拓吧,當(dāng)你把你的智慧融入進(jìn)去以后,一行行程序就不僅是程序了,因?yàn)樗陀辛松?BR> 關(guān)于c中的初始化相關(guān)部分,如指針,如全局變量與局部變量默認(rèn)初始化的區(qū)別,如靜態(tài)變量的默認(rèn)初始化,就跳過。我們從類開始。
初始化是非常重要的工作,因?yàn)槟愕念悾ù_切說是對(duì)象,程序)的執(zhí)行過程就是一系列狀態(tài)變換,而初態(tài)不正確,就不可能到達(dá)正確解了。
面向?qū)ο蟮腸++中的初始化工作,是由構(gòu)造函數(shù)來完成的,在其他場(chǎng)景可能稱為構(gòu)造器。這是大家都明白的。但是,展開來,或許您還未必清楚,如,如何設(shè)計(jì)好的默認(rèn)初始化,哪些成員變量只有的初始化形式,組合與繼承的初始化,資源淺拷貝問題,無名對(duì)象的問題,特殊需要的初始化(實(shí)例對(duì)象須化)等等。我將在vc7.0上調(diào)試程序,每次調(diào)試一個(gè),談一個(gè)問題,試圖給您解釋清楚。愿于您有所幫助。
這次就說說好的初始化過程與靜態(tài)成員的初始化。
不管程序員如何,面向?qū)ο蟮腸++中初始化工作是必須的??!你寫了一個(gè)類,沒有寫構(gòu)造函數(shù),但是,系統(tǒng)會(huì)“暗暗的”給你一個(gè)系統(tǒng)默認(rèn)的構(gòu)造函數(shù),在實(shí)例化對(duì)象的時(shí)候它就會(huì)工作---要知道,一旦你自己定義了構(gòu)造函數(shù),系統(tǒng)就不會(huì)再提供默認(rèn)構(gòu)造函數(shù)。
問題是,我們應(yīng)該定義自己的構(gòu)造函數(shù)。否則,系統(tǒng)多半是無法達(dá)到正確的初始狀態(tài)的!
定義好的構(gòu)造函數(shù),應(yīng)該是給出多版本的構(gòu)造函數(shù),作好安全檢查工作。我們下面給出一個(gè)例子,由c++的例子改動(dòng)邇來。
需要一個(gè)類,日期Date,它有成員變量day,month,year,執(zhí)行一些相關(guān)操作。如何進(jìn)行初始化工作?我們或許會(huì)見到下面的代碼:
//...
class Date {
int d,m,y;
public:
Date(int dd=0,int mm=0,int yy=0)
{
d=dd;
m=mm;
y=yy;
}
//...
};
//...
這樣的程序沒有語法錯(cuò)誤,可以工作,但不是正確工作。下面這個(gè)語句會(huì)怎么樣呢?
Date oneday(-2,10,2002);
作簡(jiǎn)單的檢查,如下面的代碼部分。也是于事無補(bǔ)的。如對(duì)下面的語句仍然是無能為力的:
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
}
//...
};
//...
更何況,我們可能會(huì)需要用string來初始化,用char *指針來初始化:
string s="29/2/1981";
char *p="29/2/1981";