文档详情

C++ 构造函数和析构函数(Constructors  Destructors)详解.docx

发布:2025-05-13约4.59千字共7页下载文档
文本预览下载声明

C++?构造函数和析构函数(Constructors??Destructors)详解

目录一、定义:二、DefaultConstructors三、CopyConstructors

一、定义:

当object产生,有一个特殊的称为constructor的函数会自动执行。当object死亡,有一个特殊的称为destructor的函数会自动执行。Constructor可以不只一个,但destructor只能有一个。

Constructor(构造函数)就是与class同名的那些memberfunctions,例如CPoint::CPoint()或CDemo::CDemo()。Constructors不能够指定返回值类型,也就是它不必(但可以)return。constructions可以有一个或多个,各有不同类型的参数。

Destructor(析构函数)就是与class同名,且前面有加~符号的那个memberfunction,例如例如CPoint::~CPoint()或CDemo::~CDemo()。Destructor不能指定返回值类型,也就是它不必(但可以)return。每个class只有一个destructor,并且不能有任何参数。

由于globalobject的诞生比程序进入更早点,所以globalobject的constructor执行的时间更早于程序的进入点。

二、DefaultConstructors

所谓的defaultconstructor就是没有指定任何的参数的constructor。如果我们的classCA声明如下:

#includeiostream

usingnamespacestd;

classCA

public:

intgetdata(){return_data;};

CA(){_data=5;};

CA(intval){_data=val;};

protected:

int_data;

};

CA有两个constructors,分别是CA(int)和CA()。后都没有参数,正是所谓的defaultconstructor。当我产生一个CAobject而沒有指定任何参数:

CAaCA;

CA*pCA=newCA;

编译器就为我们呼叫defaultconstructor。

普遍存在于C++程序员之间的一个误解是:如果我们没有为某个class设计constructor,编译器会自动为该class制造出一个defaultconstructor来。这个说法也对也不对,这里我先提示一个结论,销稍后有更多细节探讨。什么是编译器所需要的动作?就是隐藏在C++程序代码下面,让C++诸多特征得到实现的动作,包含以下三种情况:

1.classCA內含classCZobjects,如图1:当产生一个CAobject时,隐藏在底层的必要动作是先初始化CZobject(因为CAobject中有一个CZobject)

2.classCA继承于classCZ,如图2:当产生一个CAobject时,隐藏在底层的必要动作是先调用CZ的defaultconstructor(因为CAobject中有一个CZsubobject)

3.CA是一个polymorphicclass,也就是说它有virtualfunctions,或继承于有virtualfunctions的class。当产生一个CAobject,隐藏在底层的必要动作是:将虚拟机制所需要的vptr和vtb1初始化。

由于这三种情况皆有所谓的底层的必要动作,所以编译器必须自动为classCA生成一个defaultconstructor((如果沒有任何user-definedconstructor的话),或暗中对已有的user-definedconstructor动作脚(添加一些代码)。生成出来的东西称为implicitnontrivialdefaultconstructor。

如果沒有上述需求,编译器就不会为class产生一个defaultconstructor,例如:

classCB

{public:

intgetdata(){return_data;};

protected:

int_data;

};

virtualfunctions的baseclasses),也没有内含embeddedobjects,也没有继承于其它class,所以编译器不会为它

显示全部
相似文档