简单叙述构造函数的执行顺序,以及析构函数的执行顺序
时间: 2024-05-20 22:11:36 浏览: 85
构造函数的执行顺序是按照成员变量在类中的声明顺序来决定的,即先执行类中成员变量的构造函数,然后才执行类的构造函数。如果类中有继承关系,也是按照继承关系从父类到子类的顺序执行构造函数。
析构函数的执行顺序和构造函数相反,先执行子类的析构函数,然后再执行父类的析构函数。如果类中有虚函数,则子类的析构函数应该声明为虚函数,以保证正确的析构顺序。
相关问题
定义一个包含学生信息(学号,姓名,成绩)的顺序队列和链队列,使其具有如下功能: (1) 初始化一个空队列; (2) 逐个输入学生信息并入队; (3) 出队,输出学号、姓名、成绩等信息; (4) 删除队列。 (5) 统计当前队列排队学生个数; (6) 请设计一个类似于买火车票的绿色通道功能,并简要叙述该功能对队列的影响。
顺序队列实现代码:
```c++
#include<iostream>
using namespace std;
const int MaxSize = 100; // 队列最大长度
// 定义学生结构体
struct Student {
int num; // 学号
string name; // 姓名
float score; // 成绩
};
// 定义队列类
class SeqQueue {
private:
Student data[MaxSize]; // 队列元素数组
int front; // 队头指针
int rear; // 队尾指针
public:
SeqQueue(); // 构造函数,初始化队列
~SeqQueue(); // 析构函数,释放队列
void EnQueue(Student stu); // 入队操作
void DeQueue(); // 出队操作
int QueueLength(); // 获取队列长度
void DestroyQueue(); // 销毁队列
};
SeqQueue::SeqQueue() {
front = rear = 0;
}
SeqQueue::~SeqQueue() {
}
void SeqQueue::EnQueue(Student stu) {
if ((rear+1)%MaxSize == front) {
cout << "队列已满,无法插入!" << endl;
return;
}
data[rear] = stu;
rear = (rear+1) % MaxSize;
}
void SeqQueue::DeQueue() {
if (front == rear) {
cout << "队列已空,无法删除!" << endl;
return;
}
cout << "出队:学号=" << data[front].num << ",姓名=" << data[front].name << ",成绩=" << data[front].score << endl;
front = (front+1) % MaxSize;
}
int SeqQueue::QueueLength() {
return (rear-front+MaxSize) % MaxSize;
}
void SeqQueue::DestroyQueue() {
front = rear = 0;
}
int main() {
SeqQueue q;
int n;
cout << "请输入学生的数量:";
cin >> n;
for (int i=1; i<=n; i++) {
Student stu;
cout << "请输入第" << i << "个学生的学号、姓名、成绩:";
cin >> stu.num;
cin >> stu.name;
cin >> stu.score;
q.EnQueue(stu);
}
cout << "当前队列中有" << q.QueueLength() << "名学生排队。" << endl;
cout << "下面开始出队操作:" << endl;
while (q.QueueLength() > 0) {
q.DeQueue();
}
q.DestroyQueue();
return 0;
}
```
链队列实现代码:
```c++
#include<iostream>
using namespace std;
// 定义学生结构体
struct Student {
int num; // 学号
string name; // 姓名
float score; // 成绩
};
// 定义链队列结点类
class Node {
public:
Student data;
Node *next;
Node(Student stu) {
data = stu;
next = NULL;
}
};
// 定义链队列类
class LinkQueue {
private:
Node *front; // 队头指针
Node *rear; // 队尾指针
public:
LinkQueue(); // 构造函数,初始化队列
~LinkQueue(); // 析构函数,释放队列
void EnQueue(Student stu); // 入队操作
void DeQueue(); // 出队操作
int QueueLength(); // 获取队列长度
void DestroyQueue(); // 销毁队列
};
LinkQueue::LinkQueue() {
front = rear = new Node(Student());
}
LinkQueue::~LinkQueue() {
}
void LinkQueue::EnQueue(Student stu) {
Node *p = new Node(stu);
rear->next = p;
rear = p;
}
void LinkQueue::DeQueue() {
if (front == rear) {
cout << "队列已空,无法删除!" << endl;
return;
}
Node *p = front->next;
cout << "出队:学号=" << p->data.num << ",姓名=" << p->data.name << ",成绩=" << p->data.score << endl;
front->next = p->next;
if (rear == p) {
rear = front;
}
delete p;
}
int LinkQueue::QueueLength() {
int len = 0;
Node *p = front->next;
while (p) {
len++;
p = p->next;
}
return len;
}
void LinkQueue::DestroyQueue() {
while (front) {
Node *p = front;
front = front->next;
delete p;
}
rear = NULL;
}
int main() {
LinkQueue q;
int n;
cout << "请输入学生的数量:";
cin >> n;
for (int i=1; i<=n; i++) {
Student stu;
cout << "请输入第" << i << "个学生的学号、姓名、成绩:";
cin >> stu.num;
cin >> stu.name;
cin >> stu.score;
q.EnQueue(stu);
}
cout << "当前队列中有" << q.QueueLength() << "名学生排队。" << endl;
cout << "下面开始出队操作:" << endl;
while (q.QueueLength() > 0) {
q.DeQueue();
}
q.DestroyQueue();
return 0;
}
```
绿色通道功能可以在队列的基础上增加一个优先级(或者称为紧急程度、权值)字段,当有学生进入绿色通道时,会把他们的优先级调高,从而优先出队。可以在顺序队列和链队列中都实现。
当学生进入绿色通道时,需要改变其优先级,可能会影响队列中的顺序,导致原有的队列顺序被打乱。因此,绿色通道功能会对队列的操作产生一定的影响。如果需要保持队列的顺序,可以考虑使用优先队列的数据结构实现。
阅读全文