C++ c++;变量赋值使代码工作
我有一门课: 寄存器.hC++ c++;变量赋值使代码工作,c++,visual-c++,constructor,variable-assignment,C++,Visual C++,Constructor,Variable Assignment,我有一门课: 寄存器.h #pragma once #include <string> class Register { public: Register(const std::string& name); void printName(); private: const std::string& m_name; }; 我希望它会打印两次“A”,但它会打印一次“A”和一次“A”。请告诉我这两个选项之间的区别,以及如何让第二个选项工作,因为
#pragma once
#include <string>
class Register {
public:
Register(const std::string& name);
void printName();
private:
const std::string& m_name;
};
我希望它会打印两次“A”,但它会打印一次“A”和一次“A”。请告诉我这两个选项之间的区别,以及如何让第二个选项工作,因为在创建reg
的函数中,我没有使用name
的任何其他位置
Register reg2("A");
隐式创建一个临时的std::string
实例,并从中初始化引用成员变量:
const std::string& m_name;
Register::Register(const std::string& name) : m_name(name) {
}
临时实例的生存期在构造函数调用后结束,之后会有一个悬空引用,访问它是未定义的行为
变量的初始化可确保只要变量在范围内且处于活动状态,引用就有效
要解决该问题,只需将
m_name
成员变量设置为正常的字符串
,而不是const
引用
std::string m_name;
没有足够的信息说明为什么第二个版本不能同样好地工作。你能提供一个复制你声称的行为的例子吗?什么是
m_name
?参考文献:/?@πάνταῥεῖ, 我已经更新了问题,添加了更好的example@ComputerBackup在寄存器reg2(“A”)之后
m_name
包含一个悬空引用(对已销毁对象的引用),并且以任何方式使用这种引用都会调用未定义的行为。@ComputerBackup构造函数参数的常量字符串&
很好,但您的成员变量应该是一个简单的std::string
。
const std::string& m_name;
Register::Register(const std::string& name) : m_name(name) {
}
std::string m_name;