构造函数与析构函数
接着上一篇OOP基础概念来讲,我们声明对象的时候,要先写一个类(用struct或者class都可以实现,不过由于多方面原因,我们选用class)
例如实现一个学生类,并声明对象张三
class Student{
private:
int age;
char name[20];
};
int main(){
Student zhangsan;
return 0;
}
此时,我们发现,虽然说我们已经声明了一个对象,但是我们并没有办法得知创建是否成功,也没有办法对对象进行初始化,这个时候就要用到我们的构造函数了。
构造函数(Constructor)
构造函数是一种特殊的函数,它的名字与类名相同。它在对象创建时自动调用,用于初始化对象的成员变量。构造函数没有返回类型,即使是void也不需要写。
#include<iostream>
#include<cstring> // 用于字符串处理
using namespace std;
class Student {
private:
int age;
char name[20];
public:
// 无参构造函数
Student() {
cout << "学生对象被创建" << endl;
}
// 带参构造函数
Student(int studentAge, const char* studentName) {
age = studentAge;
// 复制字符串到 name
strncpy(name, studentName, sizeof(name) - 1);
name[sizeof(name) - 1] = '\0'; // 确保字符串以 null 结尾
cout << "学生对象被创建,年龄:" << age << ",姓名:" << name << endl;
}
};
int main() {
// 调用无参构造函数
Student alice;
// 调用带参构造函数
Student bob(20, "Bob");
return 0;
}
在这个例子中,Student 类有一个简单的不含参数的构造函数,当你创建一个Student对象时,构造函数会输出一条消息,表示对象已被创建。同时,还有一个含有参数的构造函数,我们调用它的时候可以直接对这个对象的属性赋值,以达到初始化的目的。
在这里强调一点,C++中,如果你没有提供任何构造函数(无参或带参)的定义,编译器将会为你的类生成一个默认构造函数。默认构造函数是一个没有任何参数的构造函数,它被用于创建对象而不需要提供任何初始值。但是,如果你提供了任何自定义构造函数,编译器就不再自动生成默认构造函数。
析构函数(Destructor)
我们在学习C语言的时候学过malloc申请内存之后要使用free来释放,在C++之中变成了new申请内存,delete释放。那么对于一个对象来说是一样的,当我们使用构造函数创建了一个对象的时候,也需要释放这个对象的内存,我们可以通过使用析构函数来实现这个功能。
析构函数也是一个特殊的函数,用于在对象销毁时执行一些清理工作。它的名字是在类名前加上波浪号 ~。
#include <iostream>
using namespace std;
class Student {
public:
// 构造函数
Student() {
cout << "making" << endl;
}
// 析构函数
~Student() {
cout << "delete" << endl;
}
};
int main(){
Student zhangsan; // 创建学生对象,构造函数被调用
return 0; // 对象超出作用域,析构函数被调用
}
在main函数中,我们创建了一个Student对象,构造函数被调用。当main函数结束时,alice对象超出作用域,析构函数被调用。
构造函数和析构函数是面向对象编程中重要的概念,它们确保对象在创建和销毁时都经过适当的处理。这是使C++代码更有条理和可维护性的关键元素。