C++ 2 构造函数和类中的析构函数

c++ 2 constructors and a destructor in a class

本文关键字:析构函数 构造函数 C++      更新时间:2023-10-16

这是教授吹嘘的同学的正确代码,我不明白为什么它需要一个双构造函数,我最初只有第一个函数,无法弄清楚它需要两个,这落后于我作为专业人士的进步

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;
}

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

Studentrecords s(15);

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

Studentrecords s;

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

我必须指出,这是糟糕的代码:

  • 默认的Studentrecords()构造函数可以替换为 Studentrecords(int size = 25)以避免代码重复。
  • 不使用初始值设定项列表
  • 您正在管理类中的内存,这意味着您需要一个复制构造函数和复制赋值运算符
  • 最后,您使用的是 C 样式数组而不是 std::vector

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

explicit Studentrecords(int size);

这将防止胡说八道,例如

StudentRecords s = 4*5;

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

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