Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用引用的类字符串设置器_C++ - Fatal编程技术网

C++ 使用引用的类字符串设置器

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 =

如果一个类有一个string属性,并且该属性的setter采用
常量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
构造函数中,但该构造函数将进行悬空引用。在此之后您对它所做的任何事情(包括通过它分配)都是非法的。