1. 构造函数
定义:每个类都分别定义了它的对象被初始化的方式,类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,只要类的对象被创建,就会执行构造函数。
- 构造函数的名字和类名相同。
- 和其他函数不一样的是,构造函数没有返回类型。
- 类可以含有多个构造函数。
- 不同于其他成员函数,构造函数不能被声明为const的。当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得其“常量”属性。
合成的默认构造函数
类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数。默认构造函数无需任何实参。
编译器创建的默认构造函数将按照如下规则初始化类的数据成员:
- 如果存在类内的初始值,用它来初始化成员。
- 否则,默认初始化该成员。
2. 析构函数
定义:析构函数也是一个特殊的成员函数,没有返回值,不需要程序员显式调用,而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符合。
Note:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
析构函数的执行时机
- 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。
- 在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。
- new创建的对象位于堆区,通过delete删除时才会调用析构函数;如果没有delete,析构函数就不会被执行。
#include<iostream>
#include<string>
using namespace std;
class demo
{
public:
demo(string s);
~demo();
private:
string m_s;
};
demo::demo(string s):m_s(s){}
demo::~demo(){cout << m_s << endl;}
void func()
{
//局部对象
demo obj1("1");
}
//全局对象
demo obj2("2");
int main()
{
//局部对象
demo obj3("3");
//new创建的对象
demo *pobj4 = new demo("4");
func();
cout << "main" << endl;
return 0;
}