目录
概述
对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果未知,同样的,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要求我们做的事情,因此如果我们不提供构造和析构,编译器会提供。
- 构造函数:主要用于在创建对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
- 析构函数:主要作用于对象销毁前系统自动调用,执行一些清理工作。
构造函数
C++类中包含成为构造函数的特殊成员函数,他可以在调用对象时被自动调用进行对象的初始化。对象的初始化和赋值是不同的操作,C++编译器为每个类提供默认的初始化和赋值操作,用户也可以在C++类中定义自己的初始化和赋值操作。
1.默认构造函数
当用户没有一个类定义任何构造函数的情况下,C++编译器会自动为类建立一个不带参数的构造函数。默认构造函数不进行任何操作。
2.构造函数的定义
构造函数的名字应该与类名同名,并在定义构造函数时不能指定函数返回类型,即使void类型也不可以
构造函数语法 类名(){}
构造函数可以有参数,因此可以发生重载,程序在调用对象时候会自动调用构造,无须手动调用,且只会调用一次。
3.构造函数的分类及调用
分类:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
Person()
{}
Person(int a)
{}
Person(const Person& a)
{}
三种调用方式:
1、括号法 2、显示法 3、隐式转换法
//1.括号法
Person p1;//默认构造函数
Person p2(10);//有参构造函数
Person p3(p2);//拷贝构造函数
调用无参构造函数时候,不要加(),编译器会认为是一个函数的声明。
//2.显示法
Person p2 = Person(10);//有参构造函数
Person p2 = Person(p2);//拷贝构造
//3.隐式转换法
Person p4 = 10;//相当于 Person p4 = Person(10);
4.拷贝构造函数
在有些时候我们需要一个对象创建另外一个对象,为实现该功能需要使用一种特殊的构造函数“复制/拷贝构造函数”。在通常情况下,编译器为每个类建立一个默认拷贝构造函数。
拷贝构造函数的参数是引用类自己的对象,即用一个已有的对象来建立新对象,使用引用是从函数的执行效率考虑的。为了不改变原对象,要用const修饰。
析构函数
在C++类中和构造函数相对应的特殊成员函数是析构函数。在对象被从内存中删除时析构函数会被自动调用。用户应使用析构函数释放对象生存过程中分配的资源如内存等。构造函数、拷贝函数和析构函数是类的基本成员函数
1.默认析构函数
当用户没有一个类定义任何析构函数的情况下,C++编译器会自动为类建立一个析构函数,默认析构函数不进行任何操作。
2.定义析构函数
为了与构造函数区分,析构函数在类名前面加上一个“~”,作为析构函数的名称。析构函数不但不能指定函数返回类型,也不能有函数参数,所以一个类只能有一个析构函数。
析构函数语法 ~类名(){}