C++传参引用局部变量

7

我是一名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类的构造函数。当函数结束时,变量username超出范围,因此应删除User类的m_username成员的值。
但是它仍然可以在函数外部访问,例如,主方法将“someUser”打印到控制台。
为什么?

createUser 中的 username 局部变量超出作用域并被删除。User 实例中的 m_username 成员变量是完全独立的变量。 - user253751
2个回答

6

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

1
用户名变量是通过引用传递的,当分配给m_username时会被复制,对吗? - Teimuraz
@moreo 这是正确的。(当然是在你的代码中,而不是这个答案中的代码,其中m_username是一个引用) - user253751

2

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接