[英]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
超出范圍,因此應刪除類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;
}
當函數結束時,變量用戶名超出范圍,因此應刪除類User的m_username成員的值。
那是不對的。 我沒有看到你的用戶構造函數的實現,但我想它只是做了給定字符串的副本。 m_username
沒有到本地變量的進一步鏈接,它是一個自己的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.