默认赋值运算符如何使用字符串指针



代码应该在运行时失败吗?Visual Studio执行它没有失败

#include<iostream>
#include <string>
using namespace std;
class Boy
{
string* _name;
public:
Boy(string n) :_name(new string(n)) {}
string getName() const { return *_name; }
};
int main() {
Boy t("Tom");
string str = "Tom2";
t = str;
cout << t.getName();
return 0;
}

代码应该在运行时失败吗?

不,不应该。

让我们剖析一下,下面这一行的作用:

t = str;

隐式构造了一个临时Boy实例。因此,它只是与

t = Boy(str);

operator=将构造函数中生成的指针复制到t._name。 临时创建的Boy实例将消失,而不会删除内部管理的指针(应删除

)。因此,您的代码在没有故障或未定义的行为(但会泄漏内存)的情况下工作。


以上说了这么多,你真正应该做的,是下面的类声明:

class Boy {
std::string name;
public:
Boy(const std::string& n) : name(n) {}
const std::string& getName() const { return name; }
};

不要再担心指针,内存管理和所有这些东西了,YAGNI。std::string和 C++ 标准库提供的其他容器类旨在以高效、安全且不易出错的方式为您完成所有这些工作。

最新更新