[英]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.