C ++通过引用局部变量传递

时间:2016-02-03 01:39:23

标签: c++ pass-by-reference

我是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_usernameUser成员的值应该 删除。

但仍然可以在此功能之外访问,例如main方法将“someUser”打印到控制台。

为什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

您可能会考虑类似但不同的情况 - 如果m_username 是对本地变量的引用(而不是完全不相关的变量),则会遇到问题:< / p>

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;
}

答案 1 :(得分:2)

  

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

那不对。我没有看到你的用户构造函数的实现,但我想它只是做了给定字符串的副本。 m_username没有与本地变量的进一步链接,它是一个自己的实例。