c ++变量赋值使代码工作

Com*_*kup 2 c++ constructor variable-assignment visual-c++

我有一个课程:Register.h

#pragma once
#include <string>

class Register {
public:
    Register(const std::string& name);
    void printName();

private:
    const std::string& m_name;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Main.cpp的:

#include "Register.h"

int main() {
    const std::string name1 = "A";
    Register reg1(name1);
    reg1.printName();

    Register reg2("A");
    reg2.printName();

    getchar();
}
Run Code Online (Sandbox Code Playgroud)

我希望它可以打印出"A"的两倍,但它打印"A"一次,""一次.请问你能否告诉我这两个选项之间的区别以及如何让第二个选项工作,因为我没有name在创建的函数中使用任何其他位置reg

πάν*_*ῥεῖ 8

运用

Register reg2("A");
Run Code Online (Sandbox Code Playgroud)

隐式创建一个临时std::string实例,并从中初始化一个引用成员变量:

const std::string& m_name;

Register::Register(const std::string& name) : m_name(name) {
}
Run Code Online (Sandbox Code Playgroud)

临时实例的生命周期在构造函数调用之后结束,之后您有一个悬空引用,访问它是未定义的行为.

变量初始化确保引用有效,只要变量在范围内并且处于活动状态.


要解决该问题,只需将m_name成员变量设为普通变量string而不是const引用.

std::string m_name;
Run Code Online (Sandbox Code Playgroud)