我有一堂课: Register.h
#pragma once
#include <string>
class Register {
public:
Register(const std::string& name);
void printName();
private:
const std::string& m_name;
};
Register.cpp:
#include "Register.h"
#include <iostream>
Register::Register(const std::string& name) : m_name(name) {
}
void Register::printName() {
std::cout << m_name << std::endl;
}
Main.cpp:
#include "Register.h"
int main() {
const std::string name1 = "A";
Register reg1(name1);
reg1.printName();
Register reg2("A");
reg2.printName();
getchar();
}
我希望它打印两次“ A”,但是它一次打印"A"
,一次打印""
。请问我两个选项之间的区别以及如何使第二个选项起作用,因为我在创建name
的函数中没有使用reg
的任何地方?
答案 0 :(得分:8)
使用
Register reg2("A");
隐式创建一个临时std::string
实例,然后从该实例初始化引用成员变量:
const std::string& m_name;
Register::Register(const std::string& name) : m_name(name) {
}
临时实例的生命周期在构造函数调用之后结束,并且之后有一个悬挂的引用,访问它是未定义的行为。
只要变量在范围内且处于活动状态,就可以通过变量的初始化来确保引用有效。
要解决该问题,只需将m_name
成员变量设为普通的string
而不是const
引用即可。
std::string m_name;