一、關於數組對象和vector對象
Account *pact = new Account[10]
1.在堆中分配包含10個Account類對象的數組;
2.用Account類預設建構函式初始化
釋放*pact不要用delete pact只是第一個類對象上調用了解構函式;應該使用delete [] pact;
vector<Point> vec(5);//I
初始化過程
1.建立一個底層類型的臨時對象,並在其上應用預設建構函式;
2.在vector的每個元素上依次應用拷貝建構函式,用臨時類對象的拷貝初始化每一個類對象;
3.刪除臨時類對象;
I式初始化代價比較大,不推薦使用,作為一般設計原則,如下操作:
vector<Point> cvs;
int cv_cnt = cal_control_vertices();
//預留記憶體以便存放cv_cnt ponit對象
//cvs仍然為空白
cvs.reserve(cv_cnt);
//開啟一個檔案并迭代它;
ifstream infile("spriteModel");
istream_iterator<Point> cvfile(infile), eos;
//現在插入元素
copy(cvfile, eos, inserter(cvs, cvs.begin()));
二、關於初始化表和建構函式內使用資料成員的賦值之間的區別,如有如下代碼:
inline Account::Accoutn(const char *name, double opening_bal)
: _name(name), _balance(openingbal)
{
_acct_nmbr = get_unique_acct_nmbr();
}
和
inline Account::Accoutn(const char *name, double opening_bal)
{
_name = name;
_balance = openingbal;
_acct_nmbr = get_unique_acct_nmbr();
}
1.兩種實現的結果是一樣的;
2.區別:成員初始化表只提供該類資料成員初始化,而建構函式體內對資料成員設定值是一個賦值操作;
具體的說,我們可以把建構函式的執行過程分為兩個階段:隱式或顯示初始化階段和一般的計算階段。計算階段由函數體內的所有語句構成。
在計算階段,資料成員的設定被認為式賦值,而不是初始化;
隱式或顯示初始化決定與是否有成員初始化表,隱式初始化調用的順序是先調用基類的函數,然後調用類成員的建構函式,以下代碼:
inlien Account::Account()
{
_name = "";
_balance = 0.0;
_acct_nmbr = 0;
}
在初始化階段_name已經調用了它的預設構著函數,所以無須在類初始化函數中重複賦值;
對於內建非資料成員_balance和_acc_nmbr,兩種初始化方法的結果很效能基本相同,但更受歡迎的是使用成員初始化表:
inline Account::Account() : _balane(0.0), _acct_nmbr(0)
{}
兩個例外,const和引用資料成員必須在成員初始化表中初始化,當建構函式開始初始化必須都已經發生。
小提示:成員初始化表中初始化順序是 右->左
休息休息