2013-08-22 2 views
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; 
} 

выход:Объясните C++ код

Constructor called 
Destructor called 
Destructor called 

Конструктор вызывается один раз, а деструктор вызывается дважды Что happning здесь? Это неопределенное поведение?

ответ

13

Вторая строка вызывает то, что называется конструктор копирования. Подобно адвокатам, если у вас его нет, вам будет предоставлен компилятор.

Это особый тип конвертера, который вызывается при инициализации переменной другим типом.

A b(a) 
A b = a 

Оба они ссылаются на него.

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

Добавить этот код для его просмотра. Wikipedia есть дополнительная информация.

+0

спасибо, я только что узнал что-то новое :) –

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

Default Copy Constructor Используется для создания второго экземпляра. Когда вы покидаете область действия, дракрактор для обоих объектов называется

0

Существует два экземпляра созданного объекта A. Один создается конструктором, другой - конструктором копирования. Поскольку вы явно не определили его, компилятор выполнил эту работу для вас.

Как только приложение выходит, поскольку есть два объекта, метод деструктора вызывается дважды.

+1

это НЕ 'operator =' –

+1

его не оператор присваивания, который совпадает с 'operator =' –

0

A b = a => A b (a) => Это вызывает конструктор копии по умолчанию для класса.

Смежные вопросы