解释这个c ++代码

时间:2013-08-22 09:12:53

标签: c++ object constructor destructor

#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

在析构函数被调用两次时调用构造函数 这里有什么快乐的?这是未定义的行为吗?

5 个答案:

答案 0 :(得分:13)

第二行调用所谓的复制构造函数。就像律师一样,如果你没有律师,编制者会为你提供一个。

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

A b(a)
A b = a

这两个都会调用它。

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

添加此代码以查看它。 Wikipedia有更多信息。

答案 1 :(得分: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;
    }
};

答案 2 :(得分:2)

Default Copy Constructor用于创建第二个实例。 离开范围时,两个对象的目标处理器称为

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

A b = a =&gt; A b(a)=&gt;这会调用类的默认复制构造函数。