拷贝构造函数是否调用默认构造函数来创建对象?

5
在C ++中创建对象时,复制构造函数是否调用默认构造函数?如果我隐藏了默认构造函数,我仍然应该能够创建副本,对吗?

1
不清楚您所指的“默认构造函数”是什么。当您的代码没有它们并且您没有指定显式的“delete”时,C++会提供默认构造函数。然后还有被称为“默认”的无参数构造函数,但您的类不需要拥有其中之一。 - Sergey Kalinichenko
不用在意我的问题。两者都是默认值,我不关心它是编译器生成的还是程序员定义的。 - Narek
2个回答

4
答案是否定的。
对象内存的创建是通过new指令完成的。然后,复制构造函数负责实际复制(当它不是浅复制时才相关)。
如果需要,在复制构造函数执行之前,可以显式调用其他构造函数。
您可以通过复制/粘贴此代码并运行来轻松测试此功能...
#include <stdio.h>

class Ctest
{
public:

    Ctest()
    {
        printf("default constructor");
    }

    Ctest(const Ctest& input)
    {
        printf("Copy Constructor");
    }
};


int main()
{    
    Ctest *a = new Ctest();     //<-- This should call the default constructor

    Ctest *b = new Ctest(*a);  //<-- this will NOT call the default constructor
}

2

删除默认构造函数并不会阻止你复制对象。当然,你需要一种方法来首先生成对象,也就是说,你需要提供一个非默认构造函数。

struct Demo {
    Demo() = delete;
    Demo(int _x) : x(_x) { cout << "one-arg constructor" << endl; }
    int x;
};

int main() {
    Demo a(5); // Create the original using one-arg constructor
    Demo b(a); // Make a copy using the default copy constructor
    return 0;
}

演示1。

当您编写自己的复制构造函数时,应将调用路由到带参数的适当构造函数,如下所示:

struct Demo {
    Demo() = delete;
    Demo(int _x) : x(_x) { cout << "one-arg constructor" << endl; }
    Demo(const Demo& other) : Demo(other.x) {cout << "copy constructor" << endl; }
    int x;
};

Demo 2.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接