为什么构造函数和析构函数调用存在差异?

Why there is difference in constructor and destructor calls?

头文件: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;
}

Once executed, we get this!

所以,问题是我们可以看到有 4 个日期构造函数正在执行,然后有 class Employee 构造函数正在被调用。接下来,将执行两个日期析构函数。现在,当我们获得 "press an key" 选项并按下时,我们会在另外 4 个日期析构函数调用之前调用 Employee 析构函数。因此,总共有 4 次日期构造函数调用和 6 次日期析构函数调用。但是,class Employee 调用了一个构造函数和析构函数。

**为什么有4次日期构造函数调用和更多的析构函数调用,6次析构函数调用?此外,任何人都可以详细说明序列并指定调用这些构造函数和析构函数的点。

此外,需要注意的一点是,成员对象是按值传递给 Employee 构造函数的。但是如果我们通过引用传递,那么有 4 个日期构造函数调用和 4 个日期析构函数调用,而 1 个和 1 个构造函数和析构函数调用 class Employee。检查图片。

constructor and destructor calls when reference of objects is being passed to class Employee constructor

我是新手,所以这将是一个很大的帮助。谢谢 **

按值传递时,实际上是在为函数的生命周期创建另一个对象。

注意你是如何在 Employee 的构造函数中按值传递两个数据对象的吗?这意味着在 Employee 的构造函数 returns.

之前创建了两个新的 Date 对象

这些值称为 automatic ,一旦构造函数退出,它们将被自动删除,因此调用它们的析构函数。这是你的两个额外的析构函数调用的来源。

编辑: 您创建了 2 个 Date 对象,所以实际上有 2 个 Date 构造函数调用

然后您创建一个员工对象,因此您调用员工的构造函数以及另一个 2 个 Date 对象的构造函数(因为每个员工对象都有 2 个 Date 成员)

由于调用了员工的构造函数,您有我上面提到的 2 个构造函数调用,所以总共 6 个 Date 构造调用,现在一旦您的员工的构造函数结束,由 "call by value" 创建的 Date 对象将被删除并因此他们的析构函数被称为,所以到目前为止总共有 2 个析构函数,

一旦 Employee 对象被删除,它的 2 个日期对象也会被删除,所以这是另外 2 个析构函数调用。

然后另外 2 个 Date 对象被删除(在 main 中声明),因此另外 2 个析构函数调用。

祝你学习 C++ 顺利!

另外两个析构函数调用是由隐式复制构造函数生成的 Date 对象生成的,当按值传递给 Employee class 构造函数时。一旦 Employee 构造函数完成,这两个新的 Date 对象就会被销毁。