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对象是错误的。
转载于:https://blog.51cto.com/freetoskey/884500