c++ - 使用引用的类字符串设置器
问题描述
如果一个类有一个字符串属性,并且该属性的设置器采用 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
吗?
解决方案
字符串是否存在超出范围的风险?
不,因为作业会复制数据。
这似乎工作正常,但对我来说没有意义。如果我传递了对其他任何东西或指针的引用,我就会遇到大问题。std::string 有什么特别之处吗?
不,这绝对适用于任何类型的对象。关键是您正在复制成员函数内的引用事物,而引用仍然有效。在那之后发生什么都没关系。
一种更现代的方法是:
class Foo {
public:
std::string name;
void SetName(std::string name){
this->name = std::move(name);
}
};
现在,函数体移动而不是复制;复制现在在按值函数参数中完成,除非使用了调用范围std::move
!这样,如果不需要,您就不会强制复制调用范围的数据。
推荐阅读
- javascript - 承诺不会异步运行
- sql - 使用 SQL Pivot 合并两个表的数据并连接子查询
- java - 当我使用增量运算符时,为什么会打印以下内容?
- html - 如何将输入定位在它自己的div的左下角
- ansible - 用ansible发送mailconfig命令,回答问题
- javascript - 在 Ace 编辑器中嵌入语法
- c# - 如何解决 OrchardCore cms 中的启用功能问题?
- javascript - 如何将 Mongoose 中的日期转换为不同的格式
- php - 如何从 table1 的 ID 中提取数据并通过 PHP 将其放入 table2 的 FOREIGN KEY
- python - pyautogui keyboard.add_hotkey 仅用于映射具有单个键的热键