调用未定义的复制构造函数

Calling undefined copy constructor

这是我的 class 层次结构。

#include<iostream>
using namespace std;

class baseClass
{
public:
    int var;
    int* varPtr;

    baseClass(int value) : var(value), varPtr(&var)
    {
        cout << "baseClass constructor" << endl;
    }
};

class derivedClass : public baseClass
{
public:
    derivedClass(int value) : baseClass(value)
    {
        cout << "derivedClass constructor" << endl;
    }

    derivedClass(const derivedClass& objToCopy)
    {
        cout << "derivedClass copy constructor" << endl;
    }
};


int main(int argc, char** argv)
{
    derivedClass derivedObj1(5);
    derivedClass derivedObj2(derivedObj1);
    return 0;
}

这段代码给我一个没有默认构造函数的错误。这是正确的,因为我没有定义默认构造函数。现在我的问题是当我从 derivedClass 调用 baseClass 的复制构造函数时。

#include<iostream>
using namespace std;

class baseClass
{
public:
    int var;
    int* varPtr;

    baseClass(int value) : var(value), varPtr(&var)
    {
        cout << "baseClass constructor" << endl;
    }
};

class derivedClass : public baseClass
{
public:
    derivedClass(int value) : baseClass(value)
    {
        cout << "derivedClass constructor" << endl;
    }

    derivedClass(const derivedClass& objToCopy) : baseClass(objToCopy) // <- ADDED
    {
        cout << "derivedClass copy constructor" << endl;
    }
};


int main(int argc, char** argv)
{
    derivedClass derivedObj1(5);
    derivedClass derivedObj2(derivedObj1);
    return 0;
}

现在虽然我没有定义复制构造函数,但我没有得到任何错误。没有引用 baseClass 的构造函数。为什么编译器不抱怨?当我显式调用复制构造函数时,为什么只进行按位复制很高兴?为什么说 baseClass(const baseClass&) undefined 没有错误?

谢谢。

如果您不提供复制构造函数,则会将其隐式添加到 class。为了防止复制您的 class,您可以 delete 编译器生成的,如下所示:

baseClass(const baseClass& objToCopy) =delete;

第一个程序中的编译器错误,因为它试图调用无参数构造函数而不是复制构造函数来构造对象的基 class 部分。由于您已经为 class 定义了自定义构造函数,因此不会隐式生成默认的无参数版本。

我相信,这种行为的原因与自 C++11 以来的 constructor delegation 有关。

在派生的 class 中,复制构造函数是这样定义的:

derivedClass(const derivedClass& objToCopy)
{
    cout << "derivedClass copy constructor" << endl;
}

默认情况下,派生 class 的复制构造函数使用基 class 的复制构造函数,但是您明确声明了一个复制构造函数而没有指定要如何构造基 class 对象,因此编译器尝试使用默认构造函数。

你应该写:

derivedClass(const derivedClass& objToCopy): baseClass(objToCopy.value)
{
    cout << "derivedClass copy constructor" << endl;
}

正确使用显式基础构造函数。