关于类模板的构造函数调用问题
自己照着算法书上写了一个类模板Vector来仿造vector的功能,其中的构造函数如下
- C/C++ code
explicit Vector( int initSize = 0 ): theSize(initSize), theCapacity(initSize + SPARE_CAPACITY) { objects = new Object[theCapacity]; } Vector(const Vector & rhs): objects()//书中的程序括号中有NULL { operator=(rhs); } const Vector & operator= (const Vector & rhs) { if(this != &rhs) { delete[] objects; theSize = rhs.size(); theCapacity = rhs.capacity(); objects = new Object[capacity()]; for(int k = 0; k < size(); k ++) objects[k] = rhs.objects[k]; } return *this; }
在测试程序中我使用这两个构造函数分别初始化三个Vector类:
- C/C++ code
int main(){ Vector<string> vect(3); Vector<string> v1(vect);// Vector<string> v2=vect; --->wrong Vector<string> v2; v2 = vect; //size()和capacity()函数分别返回vector的大小和容量,这两个函数是正确的 cout<<"The size of the initial vect: "<<vect.size()<<endl; cout<<"The capacity of the initial vect: "<<vect.capacity()<<endl; cout<<"The size of the initial v1: "<<v1.size()<<endl; cout<<"The capacity of the initial v1: "<<v1.capacity()<<endl; cout<<"The size of the initial v2: "<<v2.size()<<endl; cout<<"The capacity of the initial v2: "<<v2.capacity()<<endl; return 0;}
编译没有问题,但是运行时会出现exception的错误。vect调用的构造函数是可以的,调用"="操作符的时候,第一种方法是不行的,第二种可以进行赋值。但是第二种构造函数的调用就会出现问题。请求高手解答。
[解决办法]
在复制构造函数中调用复制赋值运算符重载是不对的!两者的语义是不一样的!复制构造函数表示从无到有的过程,而复制赋值运算符重载则表示从有到有的过程。
对于Vector<string> v2=vect;
v2在构造完成前处于“无”的状态,但在operator = ( const Vector & rhs)中,v2被当作“有”的情况来处理,因此运行delete[] objects;的时候就会出现异常了。