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

时间:2015-01-27 14:42:33

标签: c++ copy-constructor

这是我的班级层次结构。

#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&amp;)未定义?

谢谢。

3 个答案:

答案 0 :(得分:2)

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

baseClass(const baseClass& objToCopy) =delete;

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

答案 1 :(得分:0)

在派生类中,复制构造函数的定义方式如下:

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

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

你应该写:

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

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

答案 2 :(得分:-1)

我相信,从C ++ 11开始,这种行为的原因与constructor delegation有关。