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

C++ C++;按引用传递局部变量,c++,pass-by-reference,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

我是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;
}
User*createUser(){
字符串username=“someUser”;
User*u=新用户(用户名);
返回u;
}
int main(int argc,char*argv[])
{
User*u2=createUser();
cout用户名()
当函数结束时,变量username超出范围,因此
应删除类用户的m_username成员的值


这是不对的。我没有看到您的用户构造函数的实现,但我想它只是复制了给定字符串。
m_username
没有进一步链接到您的局部变量,它是自己的实例。
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()常量{

返回m_username;//在
createUser
中的
username
局部变量超出范围并被删除。
User
实例中的
m_username
成员变量是一个完全独立的变量。username变量通过引用传递,然后在分配给m_username时复制,对吗?@moreo这是正确的ct。(当然,在你的代码中,不是这个答案中m_用户名作为参考的代码)