1 .为什么要定义析构函数?
如果存在具有虚函数功能的类,则由于以下原因需要虚结构函数:
1 )如果一个类有虚函数功能,它经常被用作基类
2 )如果是基类,则总是使用new分配该派生类
3 )如果派生类对象使用new分配,并由指向指向它的基类的指针控制,则通常由指向它的基类的指针删除(),如果基类没有虚拟析构,则结果不确定
如果基类中存在析构函数,则首先调用最低派生类的析构函数,然后调用每个基类的析构函数。
2 .声明为保护的析构函数
如果在派生类中定义了非基类成员对象,而基类的析构函数未用virtual限定,则如果基类指针或引用指向派生类对象并进行析构,例如,函数作用域的末尾有自动对象或者通过delete )时,调用基类的析构函数而不析构派生类定义的成员,从而导致内存泄漏等问题。
将析构函数定义为virtual可以解决此问题,但如果其他成员函数不是virtual函数,即基类没有虚函数,则将vtable引入基类和派生类,将vptr引入实例将降低运行时的性能。 如果确认只在派生类对象中使用基类而不是直接使用
将析构函数定义为protected不会导致以上问题。 在基类和派生类外部使用自动对象和delete时,这将导致错误。 这是因为访问权限禁止调用析构函数。
3 .构造函数、析构函数被声明为私有和保护时的用法
在语法上,如果某个函数声明为protected或private,则不再直接从“外部”调用该函数。
对于protected函数,可以调用子类“内部”的其他函数;
另一方面,private函数只对该类的“内部”的其他函数调用;
常用的场景包括:
1 )如果不想让外部用户直接创建类(假设此类的名称为a )的对象,并且用户只能创建此类a的子类,请将a类构造函数/析构函数声明为protected,然后单击
例如:
类a
{
保护性: a () }
公共:
.
(;
Calss b :公共a
{
公共: b (}
.
(;
A; //error
B; //ok
2 )如果构造函数/析构函数声明为private,则只有该类的“内部”函数才能构造该类的对象。
例如:
类a
{
隐私:
a () }
~A () }
公共:
void Instance ()//类内部的函数
{
A;
}
(;
上面的代码可以编译。 上面代码中的Instance函数是a类内部的函数。 在Instance函数体中构建了a的对象。
但是,这个Instance函数还没有从外部调用。 为什么呢?
要调用实例函数,必须构建对象。 但是构造函数被声明为私有。 不能直接从外部构建对象。
A aObj; //编译不通过
aObj.Instance (;
然而,如果实例是静态静态函数,则它可以直接调用而不通过对象。
类a
{
隐私:
a (:数据) 10 ) { cout 'A' endl; }
~A () cout )、a ) endl; }
公共:
静态a实例(
{
静态AA;
返回a;
}
void打印() )
{
计数数据结束;
}
隐私:
Int数据;
(;
a=a:3360instance (;
ra.Print (;
上面的代码其实是设计模式singleton模式的简单c代码实现。
整理c语言后,分布在以下10个章节。