对象的初始化和清理
- 生活中我们买的电子产品都会有基本的出厂设置,在某一天我们不用的时候会删除一些自己信息数据保证安全
- C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。
构造函数和析构函数
对象的初始化和清理是两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用结果未知
同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题
C++利用了构造函数和析构函数来解决上述问题,这两个函数将会被编译器自动调用,完成对象的初始化和清理工作。
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造 函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁之前系统自动调用,执行一些清理工作。
构造函数语法:类名() { }
1、构造函数,没有返回值也不写void
2、函数名称和类名相同
3、构造函数可以有参数,因此可以发生重载
4、程序在调用对象的时候会自动调用构造,无须手动,而且只会调用一次
析构函数语法:~类名() { }
1、析构函数,没有返回值也不写void
2、函数名称和类名相同,在名称前加上符号~
3、构造函数不可以有参数,因此不可以发生重载
4、程序在对象销毁的时候会自动调用析构,无须手动,而且只会调用一次
#include<iostream>
using namespace std;
#include <string>
class Person
{
// 构造函数
Person()
{
cout <<"构造函数的调用" << endl;
}
// 析构函数
// 对象的初始化和清理工作是编译器强制要我们做的事情,
// 因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。
~Person()
{
cout <<"析构函数的调用" << endl;
}
}
void test1()
{
Person p1; // 在栈上的数据,test1执行完之后,释放这个对象
}
int main() {
test1();
// Person p1 如果放在主函数中,不会执行析构函数,因为直接走下面两行代码或者直接叉掉窗口,我们可能看不到析构函数
system("pause")
return 0;
}
函数的分类及调用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法
#include<iostream>
using namespace std;
#include <string>
class Person
{
public:
// 构造函数
// 分类 按参数分类-有参构造和无参构造(默认构造)
Person()
{
cout <<"Person的无参构造函数的调用" << endl;
}
Person(int a)
{
age=a;
cout <<"Person的有参构造函数的调用" << endl;
}
// 分类 按类