【问题标题】:C++ pass by reference local variableC++ 通过引用传递局部变量
【发布时间】:2016-02-03 01:39:22
【问题描述】:

我是 C++ 新手

我有以下课程:

class User
{
public:
    User(const string& username) {
         m_username = username;
    }

    string username() const {
        return m_username;
    }

    void setUsername(const string &username) {
        m_username = username;
    }

private:
    string m_username;
};

这里是 main.cpp 代码

User *createUser() {
    string username = "someUser";
    User *u = new User(username);
    return u;
}

int main(int argc, char *argv[])
{
    User *u2 = createUser();
    cout << u2->username() << endl;
    return 0;
}

在函数createUser() 中,我正在创建局部变量username 并通过引用User class 构造函数将其传递。当函数结束时,变量username 超出范围,因此m_username 类成员User 的值应该 删除。

但是在这个函数之外仍然可以访问,例如main 方法将“someUser”打印到控制台。

为什么?

【问题讨论】:

  • username 中的局部变量 createUser 超出范围并被删除。 User 实例中的m_username 成员变量是一个完全独立的变量。

标签: c++ pass-by-reference


【解决方案1】:

createUser 中的 username 局部变量超出范围并被删除。

User 实例中的m_username 成员变量是一个完全独立的变量,此时并没有删除它,因为它没有理由被删除。

这与你是否通过引用传递给构造函数无关。

您可能正在考虑类似但不同的情况 - 如果 m_username 是对局部变量的引用(而不是完全不相关的变量),您会遇到问题:

class User
{
public:
    User(const string& username)
        : m_username(username)
    {
    }

    string username() const {
        return m_username; // <---- Undefined behaviour HERE
        // where the variable that m_username refers to is accessed,
        // but that variable's already been destroyed.
    }

private:
    const string &m_username; // <---- now a reference
};

Here is main.cpp code

User *createUser() {
    string username = "someUser";
    User *u = new User(username);
    return u;
}

int main(int argc, char *argv[])
{
    User *u2 = createUser();
    cout << u2->username() << endl;
    return 0;
}

【讨论】:

  • 用户名变量是通过引用传递的,而不是在分配给 m_username 时复制,对吧?
  • @moreo 没错。 (当然,在你的代码中,不是这个答案中 m_username 是参考的代码)
【解决方案2】:

当函数结束时,变量用户名超出范围,因此 应该删除 User 类的 m_username 成员的值。

这是不对的。我没有看到您的 User 构造函数的实现,但我猜它只是复制给定字符串。 m_username 没有进一步链接到您的局部变量,它是一个自己的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多