c++笔记--数组对象、vector对象和构造函数

一、关于数组对象和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和引用数据成员必须在成员初始化表中初始化,当构造函数开始初始化必须都已经发生。
小提示:成员初始化表中初始化顺序是 右->左

休息休息

原文地址:https://www.cnblogs.com/justin/p/2728.html