簡體   English   中英

為什么構造函數和析構函數調用存在差異?

[英]Why there is difference in constructor and destructor calls?

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

  };

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


   };

主要() function

#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 個日期構造函數正在執行,然后是 class Employee 構造函數正在被調用。 接下來,正在執行兩個日期析構函數。 現在,當我們獲得“按下一個鍵”選項並且一旦按下,我們就會在另外 4 個日期析構函數調用之前調用 Employee 析構函數。 因此,總共有 4 個日期構造函數調用,而 6 個日期析構函數調用。 但是,class Employee 調用了一個構造函數和析構函數。

**為什么有 4 個日期構造函數調用和更多的析構函數調用,6 個析構函數調用? 此外,任何人都可以詳細說明序列並一一指定調用這些構造函數和析構函數的點。

此外,需要注意的是,成員對象是按值傳遞給 Employee 構造函數的。 但是,如果我們通過引用傳遞,那么有 4 個日期構造函數調用和 4 個日期析構函數調用,而 class Employee 的構造函數和析構函數調用分別是一個和一個。 檢查圖片。

將對象的引用傳遞給 class Employee 構造函數時調用構造函數和析構函數

我是新手,所以這將是一個很大的幫助。 謝謝 **

當通過值傳遞給Employee class 構造函數時,隱式復制構造函數生成的Date對象會生成另外兩個析構函數調用。 一旦Employee構造函數完成,這兩個新的Date對象就會被銷毀。

當您按值傳遞時,您實際上是在為函數的生命周期創建另一個 object。

請注意您如何在 Employee 的構造函數中傳遞兩個 Data 對象的值? 這意味着在 Employee 的構造函數返回之前,將創建兩個新的 Date 對象。

這些值被稱為自動的,一旦構造函數退出,它們就會被自動刪除,因此它們的析構函數被調用。 這是您的兩個額外的析構函數調用的來源。

編輯:您創建 2 個 Date 對象,所以實際上 2 Date 構造函數調用

然后創建一個員工 object,因此您調用員工的構造函數以及另外 2 個日期對象的構造函數(因為每個員工 object 有 2 個日期成員)

由於調用了員工的構造函數,你有上面提到的 2 個構造函數調用,所以總共 6 個 Date 構造調用,現在一旦你的員工的構造函數結束,由“按值調用”創建的 Date 對象被刪除,因此它們的析構函數被調用,到目前為止總共有 2 個析構函數,

一旦 Employee object 被刪除,它的 2 個日期對象也會被刪除,所以這是另外 2 個析構函數調用。

然后另外 2 個 Date 對象被刪除(在 main 中聲明),因此另外 2 個析構函數調用。

祝你學習 C++ 好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM