posts - 15,comments - 21,trackbacks - 0
很久没有碰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 梨树阳光 阅读(1448) 评论(3)  编辑 收藏 引用 所属分类: C++

FeedBack:
# re: C++复习笔记---初始化列表
2012-08-14 15:34 | xmli
太乱了!
class Test3()
{
public:
Test3(int x,int y,int z):_z(z),_y(y)
{
_x = x;
}

private:
int _x,_y,_z;
};

不管怎样,初始化的顺序都是定义的顺序,所以,一定时_x,_y,_z,不管你是用初始化列表还是在构造函数内部,不管你的顺序是什么。
好好看看Efective C++吧。  回复  更多评论
  
# re: C++复习笔记---初始化列表
2012-08-14 17:11 | 恩戴米恩
@xmli
你觉得你说的对吗?  回复  更多评论
  
# re: C++复习笔记---初始化列表
2012-08-14 17:21 | 梨树阳光
@xmli
这里我只是想说初始化的顺序和定义的顺序有关系,跟写的顺序没有关系  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理