C++为类提供了两种特殊的成员函数,一种是构造函数,在对象创建时自动调用,用以完成对象成员变量等的初始化及其他操作(如为指针变量动态申请内存空间);另一种是析构函数,在对象撤销时自动调用,用以执行一些清理任务,如释放成员函数中动态申请的内存等。
一、构造函数
构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.
- 构造函数的名字必须与类同名;
- 构造函数没有返回类型和返回值,它可以带参数,也可以不带参数;
- 构造函数的主要作用是完成对象数据成员的初始化工作;
- 在创建一个类的新对象(使用new关键字)时,系统回自动调用给类的构造函数初始化新对象;
如果程序员没有显式地定义构造函数,编译器将为类生成“缺省构造函数”,缺省构造函数不能完成对象数据成员的初始化,只是给对象以标识符,同时为对象数据成员开辟内存空间。
二、构造函数的重载
一个类中出现了两个以上的同名的成员函数时,称为类的成员函数的重载。
在类的成员函数的重载中,比较常见形式是构造函数的重载,当类中出现了重载构造函数时,C++语言将根据构造函数中的参数个数和类型选择合适的构造函数来完成对象的构造。
三、析构函数
析构函数在对象撤销时被自动调用。
- 析构函数与类同名,之前加上~,来区别于构造函数;
- 析构函数没有返回类型,也不能指定参数,因此,析构函数只能有一个,不能被重载;
- 对象超出其作用域被销毁时,析构函数被自动调用。与构造函数不同之处在于,程序员可以根据需要显式调用析构函数,用来撤销对象,释放对象所占据的内存空间。
如果程序员没有显式地定义析构函数,编译器将为类生成“缺省析构函数”,缺省构造函数是个空的函数体,只清除类的数据成员所占的内存空间,对于类的函数成员通过new和malloc动态申请的内存空间无能为力,因此,对于动态申请的内存,应在类的析构函数中通过delete或free进行释放,这样能有效避免对象撤销在成的内存泄漏。
实例:
创建的computer.h文件
#include<iostream> #include<cstring> using namespace std; class computer { private: char *brand; float price; public: computer(const char *sz,float p) { brand=new char[strlen(sz)+1]; //对象创建时为brand分配一块动态内存 strcpy(brand,sz); //复制字符串 price=p; } ~computer() { delete brand; cout<<"清理现场"<<endl; system("pause"); } void print() { cout<<"品牌:"<<brand<<endl; cout<<"价格:"<<price<<endl; } };
创建的xigouhanshu.cpp文件
#include"computer.h" #include<stdlib.h> int main() { computer comp("Dell",7000); comp.print(); system("pause"); return 0; }
注:构造函数中,为指针初始化,开辟的内存空间大小之所以是“strlen(sz)+1”,是因为字符串处理函数strlen返回的长度是字符串实际字符数,并不包括' ',因此,需要动态申请的内存大小应做加1处理。
结果显示:
也可以在main函数中显式调用析构函数,如下:
#include"computer.h" #include<stdlib.h> int main() { computer comp("Dell",7000); comp.print(); comp.~computer(); //显式调用析构函数,comp被撤销 system("pause"); return 0; }
结果显示: