1.构造函数
- 什么是构造函数
构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行,用以为成员变量设置初始值。构造函数的名称与类名完全相同,并且不反回任何类型。当需要对成员变量设置初始值时,需要显示声明构造函数;当不需要对成员变量设置初始值,常常不会显示声明构造函数,但是此时,编译器会隐式生成一个默认构造函数,并且编译器隐式声明的构造函数为空。
//显式声明构造函数的类
class Test
{
public:
Test(int a) //显式构造函数
{
b = a;
}
void print()
{
cout << b << endl;
}
private:
int b;
};
//编译器隐式生产构造函数的类,隐式生成的构造函数为Test() {}
class Test
{
public:
void print()
{
cout << "Test constructor." << endl;
}
};
- 构造函数的初始化
显式声明的构造函数在初始化时有两种初始化方式:使用初始化列表来初始化和赋值初始化。
(1)初始化列表
格式:
构造函数():变量名1(数值),变量名2(数值){}
有以下三种情况必须使用初始化列表进行初始化:
1.需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显式调用父类的构造函数对父类数据成员进行初始化)
#include <iostream>
using namespace std;
class Test
{
public:
Test (int, int, int){
cout <<"Test" << endl;
};
private:
int x;
int y;
int z;
};
class Mytest
{
public:
Mytest():test(1,2,3){ //初始化
cout << "Mytest" << endl;
};
private:
Test test; //声明
};
int _tmain(int argc, _TCHAR* argv[])
{
Mytest test;
return 0;
}
/*输出结果为:
Test
Mytet
*/
2.需要初始化const或引用成员数据
class ConstRef
{
public:
ConstRef(int ii);
~ConstRef();
private:
int i;
const int ci;
int &ri;
};
ConsrRef::ConstRef(int ii):i(ii),ci(ii),ri(ii) {}
3.子类初始化父类的私有成员
class Test{
public:
Test(){};
Test (int x){ int_x = x;};
void show(){cout<< int_x << endl;}
private:
int int_x;
};
class Mytest:public Test{
public:
Mytest() :Test(110){
//Test(110); // 构造函数只能在初始化列表中被显示调用,不能在构造函数内部被显示调用
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Test *p = new Mytest();
p->show();
return 0;
}
(2)赋值
和普通的赋值操作一样,在此不再赘述。
这两张构造函数的初始化方式,初始化列表的适用范围更广,并且效率更高。
析构函数
- 什么是析构函数
析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后”的工作(例如在建立对象时用new开辟一片内存空间,delete会自动调用析构函数后释放内存)。析构函数名与类名相同,只是在函数名前面加一个位取反符~,以区别构造函数。它不能再任何参数,也没有返回值。只能有一个构造函数,不能重载。可以显示声明析构函数,如没有显示声明,编译器会自动生成一个缺省的析构函数。
#include<string.h>
#include<iostream>
using namespace std;
class stud
{
private:
int num;
char name[10];
char sex;
public:
stud(int n, const char nam[], char s)
{
num = n;
strcpy_s(name,nam);
sex = s;
}
~stud()
{
cout << "stus has been destructed!" << endl;
}
void display()
{
cout << "num:" << num << endl;
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
}
};
int main()
{
stud stud1(10010, "Wangli", 'f'), stud2(10011,"Zhangfun",'m');
stud1.display();
stud2.display();
return 0;
}
/*输出结果为:
num:10010
name:Wangli
sex:f
num:10011
name:Zhangfun
sex:m
stus has been destructed!
stus has been destructed!
*/