C++ 使用引用的类字符串设置器
如果一个类有一个string属性,并且该属性的setter采用C++ 使用引用的类字符串设置器,c++,C++,如果一个类有一个string属性,并且该属性的setter采用常量std::string&,那么该字符串是否有超出范围的风险 class Foo { public: std::string name; void SetName(const std::string &name){ this->name = name; } }; 那么这里发生了什么 { //... std::string name =
常量std::string&
,那么该字符串是否有超出范围的风险
class Foo {
public:
std::string name;
void SetName(const std::string &name){
this->name = name;
}
};
那么这里发生了什么
{
//...
std::string name = "name";
foo.SetName(name);
} // name goes out of scope
这似乎很好,但对我来说没有意义。如果我传递了对其他任何东西的引用或指针,我将遇到大问题。std::string
有什么特别之处吗
是否存在字符串超出范围的风险
否,因为分配生成数据的副本
这似乎很好,但对我来说没有意义。如果我传递了对其他任何东西的引用或指针,我将遇到大问题。std::string有什么特别之处吗
不,这绝对适用于任何类型的对象。关键是在成员函数中复制引用的内容,而引用仍然有效。不管之后会发生什么
更现代的方法是:
class Foo {
public:
std::string name;
void SetName(std::string name){
this->name = std::move(name);
}
};
现在,函数体进行移动而不是复制;复制现在在by value函数参数中完成,除非调用范围使用了
std::move
!这样,如果不需要复制调用作用域的数据,就不会强制复制它。Oops,耶,这更有意义。但是如果Foo
的name
属性是一个引用,我就会遇到问题。@terratatwoa是的;您只能初始化一个引用,这样问题只会存在于Foo
构造函数中,但该构造函数将进行悬空引用。在此之后您对它所做的任何事情(包括通过它分配)都是非法的。