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);
};
我想從她的初始化工作著手,試圖展現(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);
};