C++ 2 构造函数和类中的析构函数
c++ 2 constructors and a destructor in a class
这是教授吹嘘的同学的正确代码,我不明白为什么它需要一个双构造函数,我最初只有第一个函数,无法弄清楚它需要两个,这落后于我作为专业人士的进步
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
.
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在c++中使用向量时,如何调用构造函数和析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 不命名构造函数和析构函数上的类型错误
- 在 UML 类图中为C++类添加构造函数和析构函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 为什么类构造函数为其成员生成析构函数?
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 没有可调用的匹配函数(构造函数),候选函数不同于对给定类型的引用
- C++库制作,隐藏在标头中没有友元的析构函数/构造函数
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 在另一个函数/构造函数 [C++] 中初始化后使变量只读
- std::调用函数时找不到函数构造函数
- 显式调用基类析构函数/构造函数合法吗
- 函数构造函数和nullptr
- 用委托构造函数构造函数
- 虚函数构造函数和调用虚函数时会发生什么
- 一些Qt函数/构造函数参数的内存管理
- 使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
- std函数构造函数初始化