C++类的构造函数和析构函数(附带实例)
C++ 中的构造函数和析构函数是类定义中两个比较特殊的成员函数,它们都没有返回值。构造函数名和类名相同,析构函数名则是在类名前加上“~”符号。
C++ 中,类的构造函数如下:
构造函数也可以具有参数,通过参数完成初始化操作。例如:
使用析构函数时,有如下注意事项:
注意,通常情况下不必定义析构函数,使用编译器默认生成的析构函数即可。但如果类中使用 new 关键字申请了动态分配内存,则必须显式地定义一个析构函数,以释放此空间。
构造函数和析构函数的调用起止点如下:
【实例】析构函数的使用。
1) 在头文件 Person.h 中声明和定义 CPerson 类,程序代码如下:
2) 在主程序文件中实现类对象的调用,程序代码如下:
C++构造函数
为类建立对象时,需要调用构造函数,这是因为建立对象时需要对其初始化,如为成员变量赋值、设置类的属性等,这些操作需要在构造函数中完成。C++ 中,类的构造函数如下:
class CPerson // 定义 CPerson 类 { public: CPerson(); // 声明构造函数 CPerson(),函数名与类名相同 int m_iIndex; int getIndex(); }; // 定义构造函数,此为系统默认构造函数 CPerson::CPerson() { m_iIndex = 10; }CPerson() 是系统默认的 CPerson 类的构造函数,因此可以不写函数声明语句。
构造函数也可以具有参数,通过参数完成初始化操作。例如:
CPerson::CPerson(int iIndex) { m_iIndex = iIndex; }
C++析构函数
构造函数用于创建对象时为数据成员赋值,目的是初始化对象。析构函数的功能则相反,在对象删除前起资源清理作用。使用析构函数时,有如下注意事项:
- 一个类中只能定义一个析构函数,且不支持重载;
- 析构函数无参数值和返回值,不能使用 return 语句,也不用加上关键字 void;
- 若类中未显式定义析构函数,编译器会默认生成一个析构函数;
- 析构函数由编译器在对象声明周期结束时自动调用。
注意,通常情况下不必定义析构函数,使用编译器默认生成的析构函数即可。但如果类中使用 new 关键字申请了动态分配内存,则必须显式地定义一个析构函数,以释放此空间。
构造函数和析构函数的调用起止点如下:
- 自动变量:作用域是某个块,进入该块时调用构造函数,退出该块时调用析构函数;
- 全局变量:进入 main() 函数前调用构造函数,程序终止时调用析构函数;
- 动态分配对象:使用 new 关键字动态分配内存时调用构造函数,使用 delete 关键字删除动态分配内存时调用析构函数;
- 临时变量:编译器为支持计算自动产生的变量,其生存期的开始和结束点会调用构造函数和析构函数。
【实例】析构函数的使用。
1) 在头文件 Person.h 中声明和定义 CPerson 类,程序代码如下:
#include <iostream> #include <string.h> using namespace std; class CPerson //定义 CPerson 类 { public: CPerson(); //声明构造函数 ~CPerson(); //声明析构函数 char *m_pMessage; void ShowStartMessage(); void ShowFrameMessage(); }; CPerson::CPerson() //构造函数CPerson(),使用 new动态分配一块内存 { m_pMessage = new char[2048]; } void CPerson::ShowStartMessage() //成员函数 ShowStartMessage() { strcpy(m_pMessage, "Welcome to MR"); cout << m_pMessage << endl; } void CPerson::ShowFrameMessage() //成员函数ShowFrameMessage() { strcpy(m_pMessage, "****"); cout << m_pMessage << endl; } CPerson::~CPerson() //析构函数~CPerson(),使用 delete 释放动态分配的内存空间 { delete[] m_pMessage; }
2) 在主程序文件中实现类对象的调用,程序代码如下:
#include <iostream> using namespace std; #include "Person.h" int main() { CPerson p; p.ShowFrameMessage(); p.ShowStartMessage(); p.ShowFrameMessage(); // 定义对象 p }程序运行结果为:
****
Welcome to MR
****