默认赋值运算符如何与字符串指针一起使用
how default assignment operator works with string pointer
代码应该在运行时失败吗? 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;
}
Should the code fail during runtime?
不,不应该。
让我们来剖析下一行的作用:
t = str;
隐式构造了一个临时 Boy
实例。因此它只是与
相同
t = Boy(str);
operator=
将构造函数中生成的指针复制到t._name
。
临时创建的 Boy
实例消失了,没有删除内部管理的指针(应该如此)。
因此您的代码可以正常工作,不会出现故障或未定义的行为(但会泄漏内存)。
上面说了这么多,你真正应该做的,是下面的class声明:
class Boy {
std::string name;
public:
Boy(const std::string& n) : name(n) {}
const std::string& getName() const { return name; }
};
别再担心指针、内存管理和所有这些东西了,YAGNI。 std::string
和 c++ 标准库提供的其他容器 classes 旨在以高效、安全且不易出错的方式为您完成所有这些工作。
代码应该在运行时失败吗? 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;
}
Should the code fail during runtime?
不,不应该。
让我们来剖析下一行的作用:
t = str;
隐式构造了一个临时 Boy
实例。因此它只是与
t = Boy(str);
operator=
将构造函数中生成的指针复制到t._name
。
临时创建的 Boy
实例消失了,没有删除内部管理的指针(应该如此)。
因此您的代码可以正常工作,不会出现故障或未定义的行为(但会泄漏内存)。
上面说了这么多,你真正应该做的,是下面的class声明:
class Boy {
std::string name;
public:
Boy(const std::string& n) : name(n) {}
const std::string& getName() const { return name; }
};
别再担心指针、内存管理和所有这些东西了,YAGNI。 std::string
和 c++ 标准库提供的其他容器 classes 旨在以高效、安全且不易出错的方式为您完成所有这些工作。