【问题标题】:c++ variable assignment makes code workc++ 变量赋值使代码工作
【发布时间】: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&amp; 很好,但你的成员变量应该是一个简单的std::string

标签: c++ visual-c++ constructor variable-assignment


【解决方案1】:

使用

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-03-16
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多