当前位置:编程学习 > C/C++ >>

C++复习笔记---初始化列表

很久没有碰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 www.zzzyk.com
{
public:
    Test3(int x,int y,int z):_z(z),_y(y),_z(x)
    {
        _x = x;
    }

private:
    int _x,_y,_z;
};
比如这种就是问题的。_z被初始化了2次。


作者:yg2362
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,