gpt4 book ai didi

c++ - 在 C++ 构造函数中使用自动变量

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:21 25 4
gpt4 key购买 nike

所以我读到,使用 new 意味着您必须手动管理内存,而使用自动变量意味着当变量超出范围时它将被删除。这如何与构造函数一起工作?如果我使用自动变量创建一个对象,它是否会被保存?

例如,如果我有一个类:

class University{
Student s;
public:
University(int id, char* name){
Student x(id, name);
s = x;
}
};

这行得通吗? (假设我有一个为 Student 类正确定义的复制构造函数)。如果这确实有效,为什么会有人想要使用 new 呢?我是 C++ 的新手,如果这是一个愚蠢的问题,我深表歉意。

最佳答案

是的,它有效。 s首先获取默认构造,然后仅在 x 时复制分配构建成功。如果引发异常并且它转义了 University构造函数,两者都是sx如果它们被成功构建,则被破坏。

也就是说,最好的写法是不创建 x并初始化 sUniversity构造函数的初始化列表改为:

class University
{
private:
Student s;

public:
University(int id, char* name)
: s(id, name)
{
}
};

也就是说,您的问题是关于 new 的.等效项如下所示:

class University
{
private:
Student *s;

public:
University(int id, char* name)
: s(new Student(id, name))
{
try
{
// do something that might throw an exception
}
catch (...)
{
delete s;
throw;
}
}

~University()
{
delete s;
}
};

try/catch 的原因是因为如果构造函数抛出异常,则不会调用析构函数。

可以使用自动变量将上面的内容替换为以下内容:

class University
{
private:
std::auto_ptr<Student> s; // or std::unique_ptr if you are using C++11

public:
University(int id, char* name)
: s(new Student(id, name))
{
}
};

无论是否抛出异常,s构建成功后会被销毁。

关于c++ - 在 C++ 构造函数中使用自动变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com