2015-05-18 2 views
1

Я пытаюсь понять следующий код.Конструктор, не вызываемый во время назначения

Я создал два класса BClass и DClass следующим образом.

// Мой Заголовочный файл

class BClass 
{ 
    public: 
     BClass(); 
     ~BClass(); 
    virtual void PrintMe() const; 
}; 

class DClass : public BClass 
{ 
    public: 
     DClass(); 
     ~DClass(); 
    void PrintMe() const; 
}; 

// Мой CPP файл

BClass::BClass() 
{ 
} 


BClass::~BClass() 
{ 
} 

void BClass::PrintMe() const 
{ 
    printf("This is base class \n"); 
} 

DClass::DClass() 
{ 
} 

DClass::~DClass() 
{ 
} 

void DClass::PrintMe() const 
{ 
    printf("This is derived class \n"); 
} 

// Мой главный файл

BClass b; //BClass constructor called 
b.PrintMe(); 

DClass d; //DClass constructor called 
d.PrintMe(); 

BClass* b1 = &d; //No constructor called as it is pointer assignment 
b1->PrintMe(); 

BClass b2 = d; //No constructor called...expecting BClass constructor to be called??? 
b2.PrintMe(); 

В последнем разделе, я ожидал, что BClass конструктор для вызова. Но это не так. Может ли кто-нибудь объяснить мне, что происходит?

Если сделать так, мы знаем, BClass конструктор вызывается

BClass b2; //BClass constructor called 
b2 = d; 

Может кто-нибудь объяснить разницу между

BClass b2 = d; 

и

BClass b2; 
b2 = d; 

Спасибо.

ответ

5

BClass b2 = d; звонки copy constructor из BClass, который неявно генерируется компилятором, поскольку выполняются все условия для его неявного генерации.

BClass b2; b2 = d; вызывает конструктор по умолчанию BClass, а затем вызывает оператор присваивания копии, который также неявно генерируется.

+0

Благодарим вас за разъяснение. – jaklucky

+0

Почему b2.PrintMe() вызывает BClass :: PrintMe(), даже если он инициализирован объектом DClass? – jaklucky

+0

@jaklucky, потому что тип 'b2'' 'BClass' (и [нарезка] (http://stackoverflow.com/q/274626/3959454) произошел во время назначения). Если вы хотите виртуальное поведение, вы можете написать 'BClass & b2 = d', который создает ссылку, или создать указатель, как в вашем коде. –

1

Конструктор копирования называется вместо этого смотреть на эту http://en.cppreference.com/w/cpp/language/copy_constructor

BClass b2 = d; 

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

BClass b2; //The default constructor is called at line 1 
b2 = d;//The assignment operator is called 

реализовать конструктор копирования и оператор назначения, распечатать подсказки, чтобы увидеть разницу

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