1.学生管理类
设计一个学生信息管理类StudentInfo,包含学生的姓名、学号和成绩。要求实现以下功能:
(1)定义合适的构造函数初始化学生信息;
(2)实现拷贝构造函数,用于创建一个新的学生对象,其信息与给定学生的对象相同;
(3)在合适的时候调用析构函数,输出学生对象被销毁的信息。
cpp
#include<iostream>
#include<string> // 添加string头文件
using namespace std;
class StudentInfo {
public:
string name;
int id;
double grade;
public:
StudentInfo() {}
StudentInfo(string name, int id, double grade) {
this->name = name; // 修正:先赋值name
this->id = id;
this->grade = grade;
cout << "带参构造函数:学生信息为:" << name << " " << id << " " << grade << endl;
}
StudentInfo(const StudentInfo& s) {
this->name = s.name;
this->id = s.id;
this->grade = s.grade;
cout << "拷贝构造函数:学生信息为:" << name << " " << id << " " << grade << endl;
}
~StudentInfo() {
cout << "被销毁的信息的学生信息为:" << name << " " << id << " " << grade << endl;
}
};
int main() {
StudentInfo si("小丽", 15, 99.5);
StudentInfo si2(si);
// 不要显式调用析构函数,否则会导致双重析构
// si2.~StudentInfo();
return 0;
}
2.动态数组类
设计一个动态数组类DynamicArray,能够存储整数。要求实现以下功能:
(1)构造函数初始化数组大小Size=0,容量Capacity为一个默认值,数组需要在堆区申请内存;
(2)实现拷贝构造函数,复制另一个动态数组的内容;
(3)在析构函数中释放动态分配的内存。
cpp
#include<iostream>
#include<string>
using namespace std;
class DynamicArray {
public:
int size;
int capacity;
int* data;
public:
DynamicArray(){
}
DynamicArray(int capacity) {
this->capacity = capacity;
this->size = 0;
this->data = new int[capacity];
}
DynamicArray(const DynamicArray& other) {
this->size = other.size;
this->capacity = other.capacity;
//一块和旧对象空间相同的内存
this->data = new int[other.capacity];
//拷贝数组的元素
for (int i = 0; i < other.size; i++) {
data[i] = other.data[i];
}
}
void push_back(int value) {
if (size == capacity) {
int newcapacity = 2 * capacity;
int* newdata = new int[newcapacity];
for (int i = 0; i < size; i++) {
newdata[i] = data[i];
}
delete[] data;
data = newdata;
capacity = newcapacity;
}
data[size++] = value;
}
~DynamicArray() {
delete[] data;
}
};
int main() {
return 0;
}
上面的程序中,拷贝构造函数实现了对新对象的深拷贝,按照**原对象的capacity大小在堆内存中开辟空间,并通过循环实现每个数组元素的依次拷贝。
这里也简单实现了push_back函数,函数体的逻辑为:
- 当数组的有效元素数量size == 数组的总容量capacity时,就将数组进行扩容(新容量为原容量的2倍);
- 在堆内存中申请新的空间newdata,并将原数组data的所有元素依次拷贝到newdata中;
- 拷贝结束后释放原来data占用的堆空间;
- 将新的大容量空间newdata赋值给data指针,将新容量newcapacity赋值给原容量capacity;
- 将要添加的新元素value赋值到data[size]位置,然后size加1。