第十三天:構造函數是成員函數。
當對對象數據處理結束後可以用析構函數以自定義的方式將其清除。析構函數是用來清除數據的特殊成員函數。
記住:構造函數和析構函數是進行對象數據的創建,初始化,清除工作的成員函數,可以重載構造函數,使一個類不止具備一個構造函數,因有時需要以這些方法中的某一種分別創建不同的對象。不能重載析構函數。
構造函數作為成員函數和類有相同的名字。例:一個類名為:aClass,構造函數就是aClass()。構造函數沒有返回值,而且不能定義其返回類型,void也不行。析構函數同樣使用這一點。當編寫重載函數時,只有參數表不同,通過比較其參數個數或參數類型可以區分兩個重載函數。
file://包含三個構造函數的類頭
class Children{
char name[25];
int age;
float Weight;
public:
void prData(void);
char * getname(void);
int getage(void);
float getWeight(void);
Children(void);//三個構造函數的聲明;
Children(int,float);
Children(char *,int,float);
~Children();//析構函數
};
析構函數作為類的成員函數也具有和類相同的名字,不同的是在函數其前多了一個~符號。名為aClass的類的析構函數~aClass()。一個類只能有一個析構函數,析構函數為成員函數沒有參數,沒有返回值,不能重載。
如果構造函數為數據成員分配了內存空間,那麼析構函數做的就是釋放內存。只要變量在其作用域范圍之內,其值都是有效的。
VC++在定義變量時調用構造函數,在變量出了作用域時調用析構函數。時機是自動的。
構造函數和析構函數應該是公用成員函數。
構造函數原型可以帶缺省參數。但不能和空參數同時在不帶參數的情況下使用。
當定義對象數組時,編寫構造函數和析構函數。當創建數組時,VC++用構造函數構造對象數組中的每一個元素。而在出了作用域要清除數組時,由析構函數來釋放所有對象。
創建包含指針成員的對象時,應重災賦值操作符的函數和拷貝構造函數。
拷貝構造函數是一種特殊類型的構造函數。它的參數是一個對象變量的引用。當根據某個對象初始化新對象時,或是通過引用傳遞返回對象時,需要調用拷貝構造函數。
//////////////////////////////////////////////////////////////
file://字符串類string彌補了VC++沒有字符串的缺憾
file://copyright rbg and 2000
file://Filename:StrClass.cpp
//////////////////////////////////////////////////////////////
#include
#include
class String{
char *st;
public:
String &operator=(const String &);
friend String operator+(const String &,const String &);
friend ostream &operator<<(ostream &,const String &);
String();
String(const char *);
String(const String &);
~String();
};
String &String::operator=(const String &s)
{
if(this==&s)
{return *this;}
delete [] st;
st=new char[strlen(s.st)+1];
strcpy(st,s.st);
return * this;
}
String::String()
{
st=;
}
String::String(const char *s)
{
st=new char[strlen(s)+1];
strcpy(st,s);
}
String::String(const String &s)
{
st=new char[strlen(s.st )+1];
strcpy(st,s.st );
}
String::~String ()
{
delete []st;
}
String operator+(const String &source,const String &tar)
{
if(!strlen(source.st))
return tar;
else if(!strlen(source.st))
return source;
String temp;
temp.st=new char[strlen(source.st)+strlen(tar.st)+1];
strcpy(temp.st,source.st );
strcat(temp.st ,tar.st );
return temp;
}
ostream &operator<<(ostream &out,const String &s)
{
out< return out;
}
////////////////////////////////////////////////////////////////////////
main(){
String myname;
String youname("zhangsan");
String hisname=youname;
myname="renbugang";
cout<<"My name is:"< cout<<"You name is:"< cout<<"His name is:"< hisname="lisi";
cout<<"His name chanage:"< String ourname;
ourname=myname+youname+hisname;
cout<<"Our name is:"< return 0;
}
第十四天:關鍵字static(靜態),它保證了局部變量在塊結束時不被破壞。
static放在int,float等數據類型標識符前,也可以放在自定義的數據類型名前。static也稱延長生存。和全局變量的靜態生存期對應的是局部變量缺省的動態生存期。
全局變量是靜態的,不可能被定義為動態。全局變量自它的定義之處開始一直到源碼結束都有效。若在全局變量的前面加上關鍵字static,則表示該全局變量擁有文件作用域。
與全局變量相仿,在函數前冠以關鍵字static可以限制該函數的可見性,使得其余與這個文件相連的文件無法使用它。如果別文件使用了同名的不會發生沖突。
如果希望另一個源文件在連接完後調用文件中的非靜態函數,必須在所有調用此函數的文件中說明原型,並冠以關鍵字extren.
非靜態的全局變量和函數具有外部連接性,也就是說現行源文件之外的代碼也可以使用這些沒有用static定義的全局變量和函數,靜態全局變量和函數具有內部連接性,只有現行文件可以使用。
執行程序回到塊中希望保持其變量的值,使用static定義其局部變量。
VC++為每個類僅保留一套成員函數,每個對象都有其所屬類的成員函數的函數指針。
靜態數據成員通常用來記錄已創建對象的個數,例如,構造函數每次調用時將其靜態成員加一,在析構函數中將相應的靜態成員減一。
使用作用域操作符::訪問靜態數據成員和成員函數,靜態成員不於任何對象相連,所以必須通過類調用靜態函數或訪問靜態成員。
利用靜態的成員函數訪問私有的靜態數據成員。
在main()前初始化靜態數據成員,在靜態數據成員前加數據類型。
使用靜態數據成員記錄類的使用情況,如總計或平均值。
幾個概念:
編譯:將源代碼(.cpp)轉換為目標代碼(.obj)。
目標代碼:源文件的內部二進制表示形式。是機器能理解的程序格式,源代碼是程序員能理解的程序格式。
連接:將所有的有關的目標代碼連接成一個單獨的可執行文件(.exe)。
可執行文件:程序被編譯連接後的狀態。
把程序分成幾個文件,特別是類的頭部和類的實現部分應該分離出來,這樣能保證使用類的程序清晰易讀。