C ++的破坏功能序列

时间:2015-01-08 06:44:11

标签: 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)为什么要删除两次新测试?

提前致谢。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您正在使用隐式复制构造函数。 将创建一个新的匿名对象,并将其分配给您的变量工具并删除 然后tool.Print()执行。 再次创建一个新的匿名对象,分配给您的变量工具并被删除并执行tool.Print()。

获得理想的结果(据我所知)你必须使用

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

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

即在第二个块中使用复制构造函数(隐式)

答案 1 :(得分:0)

正如Jagannath所说,你应该在ctor中添加一些信息来帮助理解究竟发生了什么,还要打印出物体的地址。

看第一行:

StringTool tool = StringTool("Test");

首先使用StringTool构造临时StringTool("Test"),使用隐式复制构造函数生成工具并删除临时对象。

如果你想避开临时对象,你应该写:

String tool("Test");

将直接使用构造函数。

对于第二个问题(“新测试”两次销毁),首先删除临时对象(如第一行),然后销毁程序tool的结尾。