类的构造和析构
一. 构造函数
-
成员变量的初始值
在栈上创建对象,成员变量初始为随机值
在堆和静态存储区上创建对象,成员变量初始值为0 -
一般而言,对象都需要一个确定的初始值
-
解决方案,定义初始化函数
存在的问题 initialize只是一个普通函数,必须显式调用
如果未调用initialize函数,运行结果是不确定的
#include<iostream> using namespace std; class Test { int i; public: void print() { cout << " i = " << i << endl; } }; Test g_t; int main(int argc, const char *argv[]) { Test l_t; Test *pt = new Test; cout << "global var: "; g_t.print(); cout << "local var: "; l_t.print(); cout << "heap var: "; pt->print(); return 0; }
-
构造函数
C++中可以定义与类名相同的特殊成员函数 这种特殊的成员函数叫做构造函数 构造函数没有任何返回类型的声明 构造函数在对象定义时自动被调用
#include<iostream> using namespace std; class Test { int i; public: Test() { i = 10; cout << "Test()" << endl; } void print() { cout << " i = " << i << endl; } }; Test g_t; int main(int argc, const char *argv[]) { Test l_t; Test *pt = new Test; cout << "global var: "; g_t.print(); cout << "local var: "; l_t.print(); cout << "heap var: "; pt->print(); return 0; }
二. 带有参数的构造函数
构造函数也遵循C++的重载规则
如果用户定义对象的同时想自己指定成员变量的值
#include<iostream>
using namespace std;
class Test
{
int i;
public:
Test()
{
i = 10;
cout << "Test()" << endl;
}
Test(int a)
{
i = a;
cout << "Test(int a)" << endl;
}
void print()
{
cout << " i = " << i << endl;
}
};
三. 析构函数
-
一般而言,需要销毁的对象都应该做清理
-
解决方案
为每个类都提供一个public的free函数 对象不再需要时立即调用free函数进行清理
-
定义:
释放资源时析构函数会被自动的调用 析构函数的函数名和类名一致,前边加“~” 析构函数的形参为“void”类型
class 类名{ ~类名(void){ 函数体 } };
-
特点
析构函数是对象销毁时进行清理的特殊函数 析构函数在对象销毁时自动被调用 析构函数是对象释放系统资源的保障
#include<iostream> using namespace std; class Test { int i; public: Test() { i = 10; cout << "Test()" << endl; } void print() { cout << " i = " << i << endl; } ~Test() { cout << "~Test()" <<endl; } }; Test g_t; int main(int argc, const char *argv[]) { Test l_t; Test *pt = new Test; cout << "global var: "; g_t.print(); cout << "local var: "; l_t.print(); cout << "heap var: "; pt->print(); delete pt; return 0; }