构造函数初始化列表中成员列出顺序要和它们在类中声明顺序相同

1.先看一下定义的模板类(模拟数组)

template<class T>

class Array

{

public:

Array(int lowBound,int hingBound);

...

private:

vector<T> data;//数组对象中存在一个vector容器对象

size_t size;

int LBound,HBound;

};

//构造函数定义,使用成员初始化列表方法

template<class T>

Array<T>::Array(int lowBound,int highBound):size(hingBound-lowBound+1),data(size)

{

}

写到这,问题就出来了,我们的本意是想创建一个Array对象,如Array arr(1,8),他会去调用上面定义的构造函数,但是C++中的游戏规则是,在构造类对象本身时,对象成员变量会按类中声明顺序先行构造,这样一来,最先声明的vector<T> data对象被构造,因为构造成员列表中有data(size),因此会调用vector的有参构造函数,但是size本身大小是多少?有的人会说是highBound-lowBound+1,这是错误的,因为成员变量size此时还未被初始化,故此size是一个随机数。所以vector在调用有参构造函数时会出现错误,创建arr对象就此宣布破产。

如何修改自定义的构造函数呢?答案就是类中声明的vector对象放到size变量后面声明

2.一个要注意的小问题:

看以下类定义:

class Wacko
{
public:
 Wacko(const char* s):s1(s),s2("")//可不敢用s2(0)

 {
     cout<<"teshf"<<endl;
 }
 Wacko(const Wacko& rhs):s2(rhs.s1),s1("")
 {

 }
 
public:
 string s1;
 string s2;
};

要注意的就是上面的//注释部分,可不敢使用时s2(0),即用0去初始化string对象是错误的。

你可能感兴趣的:(成员初始化列表,声明顺序)