因此,我读到,使用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,而是在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,它将被破坏。

09-09 20:54
查看更多