很久没有碰C++,下个项目要开始使用C++,所以很多东西需要捡起来重新看看。从今天起记录一些笔记,方便自己今后查阅。言归正传,先从构造函数的初始化列表说起。我把这个知识点细化成3个问题,1.为什么要有初始化列表,它和构造函数中初始化有什么不一样。2.初始化的顺序。3.一些注意的细节。
先说第一个问题。我们有两个东西,是必须在初始化列表里完成的,一个是const修饰的变量,一个是引用。这点我就不细说了,查阅资料的都可以找到。下面我具体说说类成员。
class Test1{
public:
Test1()
{
cout << "Test1 default constructor" << endl;
}
Test1(int i)
{
cout << "Test1 value constructor" << endl;
}
Test1(const Test1 &obj)
{
cout << "Test1 copy constructor" << endl;
}
Test1& operator = (const Test1 &obj)
{
cout << "Test1 = constructor" << endl;
return *this;
}
~Test1()
{
cout << "Test1 destructor" << endl;
}
};
我定义一个类,然后再定义一个类,其中包含Test1
class Test2
{
public:
Test2()
{
t1 = Test1(1);
}
private:
Test1 t1;
};
我们在构造函数中初始化Test1,我们看看运行结果
Test1 default constructor
Test1 value constructor
Test1 = constructor
Test1 destructor
Test1 destructor我们分析下这个输出。Test1 default constructor,这说明在进入Test1构造函数之前,已经初始化了t1成员,并且调用的是无参构造函数。Test1 value constructor这个是Test1(1)创建出来的对象。Test1 = constructor,这个表示条用了拷贝构造函数,Test1 destructor这个表示Test1(1)这个临时对象的析构,Test1 destructor这个表示是t1这个成员对象的析构。从上面的结果来看,构造函数中t1 = Test1(1);其实并不是真正意义是上的初始化,而是一次拷贝赋值。当进入构造函数内部之前,类成员会被默认构造函数初始化。如果说Test1是个很大的对象,这块会造成性能上的开销。所以,这点也是使用初始化列表的原因之一。
第二我们再来说下顺序问题。简单的原则是初始化列表里的会先于构造函数中,初始化列表里会按照变量声明的顺序。我们具体看看下面的例子。
class Test3(){
public:
Test3(int x,int y,int z):_z(z),_y(y)
{
_x = x;
}
private:
int _x,_y,_z;
};
按照上面的说法,赋值的顺序是_y,_z,_x。
第三个是注意问题,每个成员只能在初始化列表里出现一次。
class Test3{
public:
Test3(int x,int y,int z):_z(z),_y(y),_z(x)
{
_x = x;
}
private:
int _x,_y,_z;
};
比如这种就是问题的。_z被初始化了2次。
posted on 2012-08-14 10:24
梨树阳光 阅读(1445)
评论(3) 编辑 收藏 引用 所属分类:
C++