我是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)为什么要删除两次新测试?
提前致谢。非常感谢您的帮助。
答案 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
的结尾。