首页 > 编程知识 正文

c语言构造函数和析构函数,c++构造函数和析构函数

时间:2023-05-04 12:16:48 阅读:27187 作者:2847

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个章节。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。