C ++变量分配使代码正常工作

时间:2018-08-04 10:59:38

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

我有一堂课: 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的任何地方?

1 个答案:

答案 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;