首页 > 解决方案 > 使用引用的类字符串设置器

问题描述

如果一个类有一个字符串属性,并且该属性的设置器采用 a const 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吗?

标签: c++

解决方案


字符串是否存在超出范围的风险?

不,因为作业会复制数据。

这似乎工作正常,但对我来说没有意义。如果我传递了对其他任何东西或指针的引用,我就会遇到大问题。std::string 有什么特别之处吗?

不,这绝对适用于任何类型的对象。关键是您正在复制成员函数内的引用事物,而引用仍然有效。在那之后发生什么都没关系。


一种更现代的方法是:

class Foo {
   public:
      std::string name;
      void SetName(std::string name){
          this->name = std::move(name);
      }
};

现在,函数体移动而不是复制;复制现在在按值函数参数中完成,除非使用了调用范围std::move!这样,如果不需要,您就不会强制复制调用范围的数据。


推荐阅读