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

Tei*_*raz 5 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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

为什么?

use*_*751 5

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

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

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

您可能会想到类似但不同的情况-如果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;
}
Run Code Online (Sandbox Code Playgroud)


You*_*uka 2

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

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