这是教授吹嘘的同学的正确代码,我无法理解为什么它需要一个双重构造函数我最初只有第一个函数而且无法弄清楚它需要两个落后于我作为专业人士的进度
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;
}
答案 0 :(得分:6)
它不需要两个构造函数,这就是类的定义方式。这样,您可以通过两种方式创建对象:
Studentrecords s(15);
将创建大小为15的Studentrecords
对象,或
Studentrecords s;
将调用默认构造函数,并创建类型为Studentrecords
且大小为25的对象。
我必须注意到这是错误的代码:
Studentrecords()
构造函数可以替换为Studentrecords(int size = 25)
,以避免代码重复。std::vector
。答案 1 :(得分:4)
第二个构造函数允许您将StudentRecords
初始化为给定大小。这很方便,但并非绝对必要。不幸的是,还允许从int到StudentRecords
的隐式转换,您可以通过将其explicit
禁用。
explicit Studentrecords(int size);
这会阻止诸如
之类的废话StudentRecords s = 4*5;
更重要的一点是,您的类处理动态分配的资源,因此您必须遵循rule of three并提供复制构造函数和复制赋值运算符,以及您已经提供的析构函数。
答案 2 :(得分:0)
代码不需要两个构造函数。具有默认参数的单个构造函数更好。并且第一个构造函数被破坏,因为它无法设置stackSize
。