構造函數和析構函數
構造函數是一個與類同名的特殊的公有成員函數。
創建類對象時構造函數會被調用,且只調用一次/
構造函數無返回類型。
·? 默認構造函數格式:
? 類名(){.......}
Account(){ //無返回類型,無參數ID = 0; //缺省IDstrcpy(Name,""); //缺省賬戶名balance = 0.0; //缺省余額
}
· 帶參數的構造函數。其格式如下:
? 類名(形式參數表){.......}
Account(int ID,char Name[],float balance){this->ID = ID;strcpy(this->Name,Name);this->balance = balance;
}
//這個構造函數的內容和 Qt圖形界面編程入門(3) 中Inital函數完全相同
·? 拷貝構造函數
類名(類名 &c)
這里第一個類名是函數名,第二個類名是說明引用變量c的類型
Account(Account &other){ID = other.ID; //為什么可訪問other的私有成員?strcpy(Name,other.Name);balance = other.balance;
}
//拷貝構造函數,就是創建一個現有對象的副本
//C++規定,在類的成員函數中,不僅僅可利用“對象.變量名”的形式訪問自身所有的數據成員,也可以訪問同一個類的其他對象的所有數據成員
在Account的拷貝構造函數中使用引用類型是因為如果使用普通的類對象做參數,那么該函數調用時會反復不停的創建參數表里的局部對象,引發死循環。
函數重載與構造函數
函數重載是C++的專有概念。
在傳統C語言中要定義在兩個整數,三個整數,兩個實數或者若干整數中求最大值的函數,可定義如下:
int Max2(int, int);// 返回兩個整數中最大值
int Max3(int, int ,int); //返回三個整數中最大值
//返回兩數中最大值
double MaxD2(double, double);
//返回數組A前n個元素的最大值
int MaxArray(int A[],int n);
在C++中則可以定義為:
int Max(int,int); //返回兩個整數中最大值
int Max(int, int, int); //返回三個整數中最大值
//返回兩個實數中的最大值
double Max(double,double);
//返回數組A前n個元素的最大值
int Max(int A[],int n);
函數重載是指相同的作用域中的函數名稱相同,而參數不同的多個函數并存的現象。
于是在賬戶類中可能程序下面三個構造函數
Account();
Account(int ID,char Name[], float balance);
Account(Account &other);
如何調用構造函數
int main(){char name[20] = "Jack";// ..........Account a1; //構造函數a1.Initial(10112,name,600.0);Account a2(a1); //調用拷貝構造函數Account a3 //調用默認構造函數
}
構造函數只在對象創建時調用且僅僅調用一次
此后再不能通過“對象.函數名(參數)”的形式調用
對象數組如何調用構造函數
Account C[3];
C[0] = Account(10101,name,500.0);
C[1] = Account(10102,name,1600.0);
C[2] = Account(10103,name,900.0);
//也可以寫成下面形式:
Account C[3] =
{
Account(10101,name,500.0),
Account(10102,name,1600.0),
Account(10103,name,900.0)
};
動態對象如何調用構造函數
Account *pA;
//動態創建1個對象,調用默認構造函數
pA = new Account;Account *pA,*pB;
//調用帶參的構造函數
pA = new Account(10001,name,500.0);
//調用拷貝構造函數
pB = new Account(*pA);
析構函數的定義和作用
·? 析構函數函數名與類名相同,緊貼再名稱前面用波浪號~與構造函數進行區分,例如:
~Point();
·? 構造函數沒有返回類型,也不能指定參數,因為析構函數只能有一個,不能被重載;
·? 當對象被撤銷時析構函數被自動調用,與構造函數不同的是,析構函數可以被顯式調用,以釋放對象中動態申請的內存。
構造函數的初始化列表
初始化列表是構造函數特有的初始化變量的方式,被訪者構造函數形式參數表最后的)后邊,函數體起始位置的{前面
類的靜態成員
用關鍵字static修飾的數據成員叫做靜態數據成員:
class MyClass{int x;static int count; //static 放在某種類型之前
};
MyClass MemberX,MemberY;
MyClass::m_nCount = 0;
靜態成員函數只能直接訪問類中的靜態成員變量
所有非靜態成員函數均可直接訪問靜態和非靜態的數據成員
靜態成員為類的所有對象所共享