读书人

关于类模板的构造函数调用有关问题

发布时间: 2012-10-18 13:46:55 作者: rapoo

关于类模板的构造函数调用问题
自己照着算法书上写了一个类模板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;的时候就会出现异常了。

读书人网 >C++

热点推荐