C++按引用局部变量传递



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

这是主要.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超出范围,因此类User m_username成员的值应该删除。

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

为什么?

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成员的值。

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

最新更新