2
#include <iostream>
using namespace std;

class A
{
    int n;
public:
    A()
    {
        cout << "Constructor called" << endl;
    }
    ~A()
    {
        cout << "Destructor called" << endl;
    }
};

int main()
{
    A a;           //Constructor called
    A b = a;       //Constructor not called
    return 0;
}

输出:

Constructor called
Destructor called
Destructor called

构造函数被调用一次,而析构函数被调用两次 这里发生了什么?这是未定义的行为吗?

4

5 回答 5

13

第二行调用所谓的Copy Constructor。就像律师一样,如果你没有,编译器会为你提供一个。

它是一种特殊类型的转换器,当您用另一个相同类型的变量初始化变量时会调用它。

A b(a)
A b = a

这两个都调用它。

A(const A& a)
{
    cout << "Copy Constructor called" << endl;
    //manually copy one object to another
}

添加此代码以查看它。维基百科有更多信息。

于 2013-08-22T09:13:53.597 回答
3

在片段中

A b = a

您不是在调用构造函数,而是在调用生成的复制构造函数:

class A
{
    int n;
public:
    A()
    {
        cout << "Constructor called" << endl;
    }
    A(const A& rv)
    {
        cout << "Copy constructor called" << endl;
        // If you are not using default copy constructor, you need
        // to copy fields by yourself.
        this->n = rv.n;
    }
    ~A()
    {
        cout << "Destructor called" << endl;
    }
};
于 2013-08-22T09:13:42.640 回答
2

默认复制构造函数用于创建第二个实例。当您离开范围时,两个对象的析构函数都会被调用

于 2013-08-22T09:15:28.283 回答
0

A b=a => A b(a) => This calls the default copy constructor of the class.

于 2013-08-22T10:46:48.347 回答
0

创建了对象 A 的两个实例。一个由构造函数创建,另一个由复制构造函数创建。由于您没有明确定义一个,因此编译器为您完成了这项工作。

一旦应用退出,由于有两个对象,析构方法被调用了两次。

于 2013-08-22T09:15:59.373 回答