0

这是教授吹嘘的同学的正确代码,我不明白为什么它需要一个双重构造函数

class Studentrecords
{
private:

    struct student
    {
        string name;
        string address;
        int ID;
        double gpa;
    };

    student *stackArray;
    int stackSize;
    int top;

public:
    Studentrecords();
    Studentrecords(int size);
    ~Studentrecords();
    void push(string name, string address, int id, double gpa);
    void pop();
    bool isFull() const;
    bool isEmpty() const;
    void display();
};

Studentrecords::Studentrecords(int size)
{
    stackArray = new student[size];
    top = 0;
}

Studentrecords::Studentrecords()
{
    stackSize = 25;
    stackArray = new student[stackSize];
    top = 0;
}

Studentrecords::~Studentrecords()
{
    delete [] stackArray;
}
4

3 回答 3

7

不需要两个构造函数,这就是类的定义方式。这样,您可以通过两种方式创建对象:

Studentrecords s(15);

这将创建一个Studentrecords大小为 15 的对象,或者

Studentrecords s;

它将调用默认构造函数,并创建一个类型Studentrecords和大小为 25 的对象。

我必须注意,这是错误的代码:

  • 可以将默认Studentrecords()构造函数替换为Studentrecords(int size = 25)以避免代码重复。
  • 不使用初始化列表
  • 你在类中管理内存,这意味着你需要一个复制构造函数和复制赋值运算符
  • 最后,您使用的是 C 样式数组而不是std::vector.
于 2012-09-26T18:24:42.067 回答
4

第二个构造函数允许您将 a 初始化为StudentRecords给定的大小。这很方便,但不是绝对必要的。不幸的是,它还允许从 int 到 的隐式转换StudentRecords,您可以通过将其禁用explicit

explicit Studentrecords(int size);

这将防止诸如此类的废话

StudentRecords s = 4*5;

一个更重要的事实是您的类处理动态分配的资源,因此您必须遵循三个规则并提供一个复制构造函数和一个复制赋值运算符,除了您已经提供的析构函数。

于 2012-09-26T18:24:55.483 回答
0

该代码不需要两个构造函数。具有默认参数的单个构造函数更好。第一个构造函数被破坏了,因为它无法设置stackSize

于 2012-09-26T18:26:43.297 回答