想知道更多区块链技术知识,请百度【链客区块链技术问答社区】
构造函数
- 定义
与类同名、无返回值类型的成员函数。
析构函数是对象创建的一部分,在创建对象时,会被自动调用;创建对象后,析构函数就不能再被调用
默认析构函数:不带参数,或者所有参数都有默认值的的析构函数,析构函数可以重载。
类的析构函数一般是公开的,但是有时也把析构函数声明为私有的(如单例模式中就把析构函数声明为私有的),其作用是限制创建该类对象的范围。
- 调用
根据参数进行重载,决定调用哪个析构函数。
- 成员初始化表
对于常量数据成员和引用数据成员(某些静态成员除外),不能在声明它们时进行初始化,也不能采用赋值操作对它们初始化。
class A
{
int x;
const int y=1;//Error
int &z=x;//Error
public:
A()
{
x=0;//OK
y=1;//Error,y是常量成员,其值不能改变
}
}
它们的初始化要在成员初始化表中进行。
class A
{
int x;
const int y;
int& z;
public:
A(): z(x),y(1)
{
x=0;
}
}
或
class A
{
int x;
const int y;
int& z;
public:
A(): x(0),z(x),y(1)
{
}
}
成员初始化表的次序不决定它们的初始化次序,它们的初始化次序由它们在类中的定义的次序决定。
如果类中含有常量数据成员或引用数据成员,一定要定义带有成员初始化表的构造函数,否则编译程序生成的默认构造函数是没有成员初始化表的,这样的类是不能创建对象的。
在创建包含成员对象的对象时,首先调用本身类的构造函数,在进入本身类的析构函数之前,将会去调用成员对象类的构造函数,然后再执行本身构造函数的函数体(在继承中,要先调用基类的构造函数,再调用成员对象类的构造函数,最后执行自己的函数体)。即使成员对象初始化表为空,只要类中有成员对象,编译程序就会生成对成员对象构造函数的调用指令,只不过它调用的默认构造函数。
析构函数
- 定义
“~<类名>”
没有参数和返回值类型的成员函数。
- 调用
当对象消亡时,在系统收回它所占的存储空间之前,它的析构函数会自动被调用。
一般清空下不需要定义析构函数,但是,如果对象在创建后申请了一些资源并且没有归还这些资源,就要定义析构函数在对象消亡前归还这些资源。
如果类中为提供析构函数,编译程序会在需要时隐式提供一个析构函数,该析构函数负责调用成员对象类和基类的析构函数。
class A()
{
char *str;
public:
A()
{
str=NULL;
}
A(const char *p)
{
str = new char(strlen(p)+1);
strcpy(str,p);
}
~A()
{
delete []str;
str = NULL;
}
}
当包含成员对象的对象消亡时,先调用本身类的析构函数,本身类的析构函数的函数体执行完毕后,再调用成员函数对象类的析构函数(在继承中,先调用和执行自己的析构函数,然后调用成员对象类的析构函数,最后调用基类的析构函数)。如果有多个成员对象,则成员对象析构函数的调用次序与它们定义的次序正好相反。
我是【链客】六级算力等级《守护平井一夫》 为各位解答区块链技术问题,欢迎加入。
链客区块链技术问答社区,有问必答!!
国内域名:www.liankexing.com 复制网址至浏览器即可进入社区
国际域名:www.lk.wiki QQ群: 725414372