调用body中的方法并在构造函数列表中调用它之间的区别

时间:2016-03-10 19:16:52

标签: c++ copy-constructor

我有一个名为Array2D的类,其中包含一个复制构造函数Array2D(const Array2D&)。我遇到的问题是,无论何时调用复制构造函数,我的程序都会停止。构造函数是:

Array2D(const Array2D& arr) {
    Array2D(arr.rows, arr.cols); //Sets the variables cols and rows and
                                 //sets a pointer T* ptr = new T[rows*cols]
    for(size_t i = 0; i < rows*cols; i++)
        ptr[i] = arr.ptr[i];
}

我将其他构造函数的调用移到了构造函数列表中:

Array2D(const Array2D& arr)
: Array2D(arr.rows, arr.cols) {
    for(size_t i = 0; i < rows*cols; i++)
        ptr[i] = arr.ptr[i];
}

有人可以告诉我为什么代码的第二个版本可以工作而第二个版本没有?

P.S。:这是从复制构造函数调用的构造函数。

Array2D(size_t r, size_t c)
: rows(r), cols(c), ptr(new T[r*c]) {}

1 个答案:

答案 0 :(得分:4)

Array2D(const Array2D& arr) {
    Array2D(arr.rows, arr.cols); //Sets the variables cols and rows and
                                 //sets a pointer T* ptr = new T[rows*cols]
    for(size_t i = 0; i < rows*cols; i++)
        ptr[i] = arr.ptr[i];
}

Array2D(arr.rows, arr.cols);基本上是非操作。它会创建一个临时的Array2d,然后它就会被销毁。这意味着ptr永远不会被初始化,使用它是undefined behavior

使用

Array2D(const Array2D& arr)
: Array2D(arr.rows, arr.cols) {
    for(size_t i = 0; i < rows*cols; i++)
        ptr[i] = arr.ptr[i];
}

使用委托构造函数初始化成员变量,然后设置数组元素。