【发布时间】:2019-01-12 01:43:28
【问题描述】:
我有一堂课: 注册.h
#pragma once
#include <string>
class Register {
public:
Register(const std::string& name);
void printName();
private:
const std::string& m_name;
};
注册.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" 和一次 ""。请您告诉我这两个选项之间的区别以及如何让第二个选项起作用,因为我在创建reg 的函数中的任何其他地方都没有使用name?
【问题讨论】:
-
没有足够的信息说明第二个版本不能同样好用。您能否提供一个minimal reproducible example 来重现您声称的行为。
-
m_name是什么?参考:/? -
@πάνταῥεῖ,我已更新问题以添加更好的示例
-
@ComputerBackup 在
Register reg2("A");之后,m_name包含一个悬空引用(对一个对象的引用,已被销毁),并且以任何方式使用此类引用都会调用未定义的行为。 -
@ComputerBackup 构造函数参数的
const string&很好,但你的成员变量应该是一个简单的std::string。
标签: c++ visual-c++ constructor variable-assignment