簡體   English   中英

C ++通過引用局部變量傳遞

[英]C++ pass by reference local variable

我是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超出范圍,因此應刪除類Userm_username成員的值。

但仍然可以在此函數之外訪問,例如main方法將“someUser”打印到控制台。

為什么?

createUserusername局部變量超出范圍並被刪除。

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

當函數結束時,變量用戶名超出范圍,因此應刪除類User的m_username成員的值。

那是不對的。 我沒有看到你的用戶構造函數的實現,但我想它只是做了給定字符串的副本。 m_username沒有到本地變量的進一步鏈接,它是一個自己的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM