我是 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;
};
这是主要.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;
}
当函数结束时,变量用户名超出范围,因此 应删除类用户m_username成员的值。
这是不对的。我没有看到您的 User 构造函数的实现,但我想它只是执行给定字符串的副本。 m_username
没有进一步链接到您的局部变量,它是一个自己的实例。