构造析构综合练习

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。
相关推荐
A星空1233 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫3 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙3 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6013 小时前
C++顺序表和vector
开发语言·c++·算法
独望漫天星辰3 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
王老师青少年编程4 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组
凡人叶枫5 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB5 小时前
使用三方库头文件未使用导出符号情景
c++
rainbow68896 小时前
Linux文件描述符与重定向原理
c++
CodeSheep程序羊7 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展