簡體   English   中英

C ++破壞函數的順序

[英]The sequence of destruction function of C++

我是C ++的初學者。 我對以下兩個文件進行了編碼,結果有些問題。

。H

#include <string>
class StringTool
{

public:

StringTool(std::string name);
~StringTool();
void Print();
std::string getName();
void setName(std::string name);

private:

std::string name;
};

.cpp

#include <iostream>
#include <string>
#include "StringTool.h"
using namespace std;

StringTool::StringTool(std::string name)
{
    this->name = name;
}

StringTool::~StringTool()
{
    cout<<"Delete: "<<name<<endl;
}

void StringTool::Print()
{
    cout<<"Print: "<<name<<endl;
}

int main() {

    StringTool tool = StringTool("Test");
    tool.Print();

    tool = StringTool("New Test");
    tool.Print();
}

輸出為:

Delete: Test
Print: Test
Delete: New Test
Print: New Test
Delete: New Test

我的問題是:1)為什么先刪除測試,然后2)為什么刪除兩次新測試?

提前致謝。 對你的幫助表示感謝。

您正在使用隱式副本構造函數。 創建一個新的匿名對象,將其分配給您的變量工具並刪除它,然后執行tool.Print()。 再次創建一個新的匿名對象,將其分配給您的可變工具,並將其刪除並執行tool.Print()。

要獲得預期的結果(據我了解),您必須使用

 StringTool tool("Test");
tool.Print();

 tool = StringTool("New Test");
 tool.Print();

在第二個塊中使用復制構造函數(隱式)

就像Jagannath所說的那樣,您應該在ctor中添加一條痕跡,以幫助了解實際發生的情況,同時還要打印對象的地址。

看第一行:

StringTool tool = StringTool("Test");

首先使用StringTool("Test")構造一個臨時StringTool ,使用隱式副本構造函數生成工具並刪除該臨時對象。

如果您想避免使用臨時對象,則應改為:

String tool("Test");

那將直接使用構造函數。

對於第二個問題(“新測試”為兩次銷毀),首先刪除臨時對象(如第一行),然后銷毀編程tool的末尾。

暫無
暫無

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

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