因此,我读到,使用new
意味着您必须手动管理内存,而使用自动变量则意味着当变量超出范围时它将被删除。这如何与构造函数一起使用?如果我使用自动变量创建对象,是否将其保存?
例如,如果我有一个课:
class University{
Student s;
public:
University(int id, char* name){
Student x(id, name);
s = x;
}
};
这行得通吗? (假设我为Student类定义了正确的副本构造函数)。如果这行得通,为什么有人要为此使用
new
?我是C++的新手,所以如果这是一个愚蠢的问题,我深表歉意。 最佳答案
是的,它有效。 s
首先获得默认构造,然后仅在x
成功构造后才进行复制分配。如果引发了异常且该异常逃脱了University
构造函数,则如果成功构造了s
和x
,则它们都会被破坏。
话虽这么说,最好的写方法是根本不创建x
,而是在s
构造函数的初始化列表中初始化University
:
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
,它将被破坏。