复制构造函数在这段代码中是如何工作的?

How does the copy constructor work in this code?

我一直在阅读 Bruce Eckel 的“Thinking in C++”并且遇到了复制构造函数。虽然我主要理解复制构造函数的必要性,但我对下面的代码有点困惑:

#include <iostream>
using namespace std;

class foo  
{
    static int objCount;
public:
    foo()
    {
        objCount++;
        cout<<"constructor :"<<foo::objCount<<endl;
    }
    ~foo()
    {
        objCount--;
        cout<<"destructor :"<<foo::objCount<<endl;
    }

};

int foo::objCount=0;
int main()
{
    foo x;
    foo y = x;
    return 0;
}

在上面的代码中,构造函数被调用一次,析构函数被调用两次。 这是我不明白的地方:

  1. yclass foo的对象,为什么编译器不调用构造函数,然后将x的内容复制到[=11] =]?

  2. 编译器提供的默认复制构造函数在这张图中的什么位置?

y is an object of class foo, so why doesn't the compiler call the constructor and then copy the contents of x into y?

确实如此。

它调用 copy 构造函数,正是为了做到这一点。

Where does the default copy-constructor provided by the compiler fit in this picture?

您没有提供自己的复制构造函数来生成任何输出,因此会调用自动生成的(不会)。

默认构造函数(看起来像 foo() 的构造函数)在复制过程中根本不会被调用。只有复制构造函数(看起来像 foo(const foo&) 的那个)。

每个构造只有 一个 构造函数。好吧,除非你使用委托构造函数,但我们改天再谈。


#include <iostream>
using namespace std;

class foo  
{
    static int objCount;
public:
    foo()
    {
        objCount++;
        cout<<"constructor :"<<foo::objCount<<endl;
    }
    foo(const foo&)
    {
        objCount++;
        cout<<"copy constructor :"<<foo::objCount<<endl;
    }
    ~foo()
    {
        objCount--;
        cout<<"destructor :"<<foo::objCount<<endl;
    }

};

int foo::objCount=0;

int main()
{
    foo x;
    foo y = x;
    return 0;
}

// constructor :1
// copy constructor :2
// destructor :1
// destructor :0
  1. y is an object of class foo, so why doesn't the compiler call the constructor and then copy the contents of x into y?

在这种情况下,它不调用构造函数,而是调用复制构造函数(您没有指定但编译器创建了它)。这里新建了一个对象y,所以需要构造(复制构造,因为你用的是其他对象x).

foo y = x;
  1. Where does the default copy-constructor provided by the compiler fit in this picture?

您也可以查看this问题。有对编译器隐式创建的其他函数的解释。有时它可能会令人沮丧(尤其是当您使用原始指针时),因此您应该了解这些功能。