我是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
超出范围,因此m_username
类User
成员的值应该
删除。
但仍然可以在此功能之外访问,例如main方法将“someUser”打印到控制台。
为什么?
答案 0 :(得分:4)
username
中的createUser
局部变量超出范围并被删除。
m_username
实例中的User
成员变量是一个完全独立的变量,此时不会删除它,因为没有理由将其删除。
这与是否通过引用将它传递给构造函数无关。
您可能会考虑类似但不同的情况 - 如果m_username
是对本地变量的引用(而不是完全不相关的变量),则会遇到问题:< / p>
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 :(得分:2)
当函数结束时,变量username超出范围,因此 m_username类成员的值应该删除用户。
那不对。我没有看到你的用户构造函数的实现,但我想它只是做了给定字符串的副本。 m_username
没有与本地变量的进一步链接,它是一个自己的实例。