Почему существует разница в вызовах конструктора и деструктора? - PullRequest
0 голосов
/ 09 мая 2020

Заголовочный файл: файл Date.h

#include<iostream>
#include<cstdlib>   
#include<cstring>  

using namespace std;

class Date{

private:
    int day;
    int month;
    int year;

public:
    Date(int d = 1, int m = 1, int y = 1900): day(d), month(m), year(y) 
    {
        cout << "date constructor is called"<< endl;
    }

    void print() const {
        cout << day << ":" << month << ":" << year <<endl;
    }

    ~Date(){
        cout << "date destructor is called"<< endl;
    }

  };

Заголовочный файл: Employee.h

#include"Date.h"

class Employee{

private:
    char *fname;
    char *lname;
    Date dob;       // object, has-a relationship
    Date hiredate;  // object, has-a relationship

public:
    Employee(char *f, char *l, Date bd, Date hd){ 
        cout << "employee constructor is called"<< endl;
        int lengthf;
        lengthf = strlen(f);
        fname = new char[lengthf+1];  
        strcpy(fname, f);

        int lengthl;
        lengthl = strlen(l);
        lname = new char[lengthl +1];
        strcpy(lname, l);

    }

    ~Employee(){
        delete [] fname;  
        delete [] lname;
        cout << "employee destructor is called"<< endl;
    }


   };

функция main () :

#include"Employee.h"

int main(){

Date db(07, 11, 1991);
Date dh; 

dh.print();

Employee e("Dan", "Lee", db , dh);  


db.print();



system("pause");
return 0;
}

После выполнения получаем это!

Итак, вопрос в том, как мы видим, выполняется 4 конструктора даты, а затем вызывается конструктор класса Employee. Далее выполняются два деструктора даты. Теперь, когда мы получаем опцию «нажать клавишу» и как только мы нажимаем, мы получаем вызов деструктора Employee перед 4 вызовами деструктора даты. Таким образом, всего 4 вызова конструктора даты и 6 вызовов деструктора даты. Однако класс Employee вызывает один конструктор и деструктор.

** Почему существует 4 вызова конструктора даты и больше вызовов деструктора, 6 вызовов деструктора? Кроме того, может ли кто-нибудь разработать последовательность и указать точки, в которых эти конструктор и деструктор вызываются, один за другим.

Кроме того, следует отметить, что объекты-члены передаются конструктору Employee по значению. Но если мы передадим по ссылке, то будет 4 вызова конструктора даты и 4 вызова деструктора даты, в то время как один и один вызовы конструктора и деструктора класса Employee. Проверьте картинку.

вызовы конструктора и деструктора, когда ссылка на объекты передается в конструктор класса Employee

Я новичок ie, так что это будет большим подспорьем. Спасибо **

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Два дополнительных вызова деструктора генерируются Date объектами, сгенерированными неявными конструкторами копирования при передаче по значению конструктору класса Employee. Эти два новых объекта Date уничтожаются, как только конструктор Employee завершает работу.

0 голосов
/ 09 мая 2020

Когда вы передаете по значению, вы фактически создаете другой объект на время существования функции.

Обратите внимание, как вы передаете по значению два объекта данных в конструкторе Employee? Это означает, что два новых объекта Date создаются до тех пор, пока конструктор Employee не вернется.

Эти значения называются automati c, и после выхода из конструктора они автоматически удаляются, в результате вызывается их деструктор. Вот откуда берутся ваши два дополнительных вызова деструктора.

Изменить: вы создаете 2 объекта Date, так что на самом деле 2 вызова конструктора Date

Затем вы создаете объект сотрудника, поэтому вы вызываете конструктор сотрудника а также еще 2 конструктора объекта Date (поскольку каждый объект сотрудника имеет 2 члена Date)

Поскольку вызывается конструктор сотрудника, у вас есть 2 вызова конструктора, о которых я упоминал выше, поэтому всего 6 вызовов построения Date, теперь, когда ваш сотрудник Конструктор завершается, объекты Date, которые были созданы с помощью "вызова по значению", удаляются, и, таким образом, вызываются их деструкторы, поэтому на данный момент всего 2 деструктора,

Как только объект Employee будет удален, его 2 объекта даты также будут , так что это еще 2 вызова деструктора.

Затем удаляются еще 2 объекта Date (объявленные в main) и, следовательно, еще 2 вызова деструктора.

Удачи в изучении C ++!

...