构造函数与析构函数

构造函数与析构函数

何为构造函数?

就像我们操作的对象和我们人一样,需要经历“出生”这一阶段,在初始设定时就设定默认参数的函数

使用方式

构造函数与类同名,并且没有返回值,没有参数类型,并且定义在类的public域内,自调用类起自动调用,无法在外部重复调用
构造函数可以重载
下面是students类的构造函数使用示例

#include<iostream>

using namespace std;
class students {
private: 
	int	ID;
	string name;
public:
	students() {
		ID = 1;
		name = "张三";
		cout << "自动初始化成功!" << endl << "姓名:" << name << endl << "学号:" << ID<<endl;
	}
	students(int a1,string name1):ID(a1),name(name1){       
	//冒号后为参数列表,这是构造函数独特的初始化方式
		cout<<"手动初始化成功!"<< endl << "姓名:" << name << endl << "学号:" << ID<<endl;
	}
	void showInfo() { // 普通函数:有返回值(void)、自定义名
		cout << "姓名:" << name << ",学号:" << ID << endl;
	}
};

int main() {
	students a;
	a.showInfo();

	students s2(20, "李四"); // 传入参数,自定义初始状态
	s2.showInfo();
}

输出

自动初始化成功!
姓名:张三
学号:1
姓名:张三,学号:1
手动初始化成功!
姓名:李四
学号:20
姓名:李四,学号:20

什么是析构函数

那么既然构造函数作为出生,那么析构函数就对应着“死亡”

使用方式

析构函数一般会在类结束调用之后自动执行,主要为清空变量及其初始化,但是如果创建的是动态内存,动用了堆区,那么就需要手动delete,不然空间会被浪费
如果需要创建,那么为了和构造函数区分,名字还是一样,不过要在前面加一个“~”
具体看如下MyString类的示例

#include<iostream>
#include<string>
using namespace std;

class MyString {
private:
    char* str; // 指针成员,指向动态内存(必须手动析构释放)
public:
    MyString(const char* s) {
        if (s == nullptr) {
            str = new char[1]; 
            *str = '\0';
        }
        else {
            int len = strlen(s);
            str = new char[len + 1]; // 为\0预留空间
            strcpy(str, s); 
        }
        cout << "构造函数:申请动态内存,字符串=" << str << endl;
    }

    // 必须手动定义析构函数:释放new的动态内存
    ~MyString() {
        delete[] str;
        cout << "析构函数:释放了动态内存!" << endl;
    }

    void print() {
        cout << "字符串内容:" << str << endl;
    }
};

int main() {
    MyString ms("Hello 析构函数");
    ms.print();
    return 0;
}

输出

构造函数:申请动态内存,字符串=Hello 析构函数
字符串内容:Hello 析构函数
析构函数:释放了动态内存!
posted @ 2026-02-01 15:27  努力的小xu  阅读(2)  评论(0)    收藏  举报