出于演绎的原因,我编写了如下代码:
class Bike
{
public:
Bike(std::string name) : m_name(name) {}
std::string& getName() const { return m_name; }
private:
std::string& m_name;
};
int main() {
string name("Trek");
Bike bike(name);
string& ref1 = name;
string& ref2 = ref1;
string& ref3 = bike.getName(); // <Error reading characters of string> why?
cout << ref1 << endl; // ok
cout << ref2 << endl; // ok too
cout << ref3 << endl; // Boom. runtime error
return 0;
}
有人可以解释一下这种行为背后的原因吗?
答案 0 :(得分:2)
有人可以解释一下这种行为背后的原因吗?
在构造函数执行完毕后,您正在存储对不活动的对象的引用。您正在存储悬空参考。
Bike(std::string name) : m_name(name) {}
^^^^^
name
是堆栈中的变量。函数返回后它不存在。
为了获得有效的引用,Bike()
的参数必须通过引用传递。
Bike(std::string& name) : m_name(name) {}
^^
答案 1 :(得分:1)
您的构造函数按值获取字符串。所以它是函数本地的副本。该字符串在函数末尾被销毁,使得对它的引用无效。如果你想在对象中存储对字符串的引用(你真的确定要这样做吗?),那么你需要确保字符串的使用时间比使用引用要长。您可以通过将构造函数参数更改为引用来实现此目的。
Bike(std::string& name) : m_name(name) {}
虽然我认为最好重新考虑一下你是否应该存储一个引用。它似乎没有多大意义。