构造函数与析构函数
构造函数与析构函数
何为构造函数?
就像我们操作的对象和我们人一样,需要经历“出生”这一阶段,在初始设定时就设定默认参数的函数
使用方式
构造函数与类同名,并且没有返回值,没有参数类型,并且定义在类的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 析构函数
析构函数:释放了动态内存!

浙公网安备 33010602011771号