Tei*_*raz 5 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 = username;
}
private:
string m_username;
};
Run Code Online (Sandbox Code Playgroud)
这是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;
}
Run Code Online (Sandbox Code Playgroud)
在函数中,createUser()我正在创建局部变量username,并将其通过引用传递给User class构造函数。函数结束时,变量username超出范围,因此应删除m_username类成员的值User。
但是在此功能之外仍然可以访问,例如main方法将“ someUser”打印到控制台。
为什么?
usernamein中的局部变量createUser超出范围并被删除。
实例中的m_username成员变量User是一个完全独立的变量,并且此时不会删除它,因为没有理由将其删除。
这与是否通过引用将其传递给构造函数无关。
您可能会想到类似但不同的情况-如果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;
}
Run Code Online (Sandbox Code Playgroud)
当函数结束时,变量 username 超出范围,因此 User 类的 m_username 成员的值应该被删除。
那是不对的。我没有看到您的 User 构造函数的实现,但我猜它只是执行给定字符串的副本。m_username没有到您的局部变量的进一步链接,它是一个自己的实例。