精华内容
下载资源
问答
  • 类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。 通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝...

    虚析构函数和protected析构函数

    一、虚析构函数

    类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。
    通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复制函数。

    作为一个经验法则,如果你有一个带有虚函数功能的类,则它需要一个虚析构函数,原因如下:

    1.如果一个类有虚函数功能,它经常作为一个基类使用。
    2.如果它是一个基类,它的派生类经常使用new来分配。
    3.如果一个派生类对象使用new来分配,并且通过一个指向它的基类的指针来控制,那么它经常通过一个指向它的基类的指针来删除它(如果基类没有虚析构函数,结果将是不确定的,实际发生时,派生类的析构函数永远不会被调用)。

    基类有虚析构函数的话,最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用

    二、protected析构函数

    对于堆中的对象,我们通常用new/delete来创建/销毁。当调用new时,它会自动去调用相应类的构造函数。同样,当调用delete时,它会自动去调用相应类的析构函数。当我们在栈中产生对象时,前面说的过程是自动完成的。即:不需要我们显式调用new/delete。这里有个前提:类的构造/析构都是public的。

    然而,当我们想禁止在栈中产生对象时,如何来实现呢?

    将构造函数设为private行吗?no!这样对象虽然不能在栈中产生,但同样也不能在堆中产生了。

    将析构函数设为private行吗?bad!这样虽然限制了栈对象,但同时也限制了继承。

    将析构函数设为protected行吗?yes!

    例如:

    class A {  
    
    protected:   
        A() { }
        ~A() { }  
     
    public:   
        static A* create() {    
            return new A() ;//调用保护的构造函数   
        }   
        void destroy() {    
    	    delete this ;//调用保护的析构函数   
    	}
    };
     
    //我们可以这样来使用它:
     
    A* pa= A::create();
    pa->destroy() ;
    

    使用场景:

    1、如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。
    2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”的函数才能构造这个类的对象了

    展开全文
  • 析构函数与合成析构函数

    千次阅读 2012-02-28 16:37:33
    4.不能被继承(继承的是成员变量和成员函数,个人理解严格说这些构造函数,析构函数不能称之为“函数”,因为不符合函数定义的特征,所以构造函数,析构函数不能被继承) 5.可以手动调用(不理

    今天看《c++ primer》的时候,突然看到合成析构函数这个名词,对析构函数了解的多点,对合成析构函数则了解的不多。

    析构函数特点:

    1.整个类只有一个,即不能重载;

    2.没有形参;

    3.没有返回值;

    4.不能被继承(继承的是成员变量和成员函数,个人理解严格说这些构造函数,析构函数不能称之为“函数”,因为不符合函数定义的特征,所以构造函数,析构函数不能被继承)

    5.可以手动调用(不理解为什么允许这么做)

    关于这个合成析构函数,《c++ primer 第四版》这么说的:

    ……编译器总会 为我们合成一个析构函数……合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员,对于类类型的成员,合成析构函数调用该成员的析构函数来撤销对象……即使我们编写了自己的析构函数,合成析构函数依旧运行……

    这里有以下几点理解:

    1.合成析构函数不管你建不建析构函数他都有;

    2.合成析构函数负责销毁对象本身,例如我们对象含有一个int成员时,合成析构函数可以回收这个int成员占用的空间(一个不含有成员变量的类的sizeof=1);这是合成析构函数真正做的事情;

    3.我们的析构函数是对合成析构函数的扩展,所以我们常常在合成析构函数中析构堆中的资源;

    4.按照合成析构函数和析构函数的分工,可以理解必然是先运行手动建立的析构函数,再运行合成析构函数;

    以上是关于析构函数和合成析构函数的理解。

    展开全文
  • C++:什么析构函数

    2018-09-03 16:59:39
    为什么要使用析构函数? 利用构造函数创建对象之后,程序负责跟踪该对象,直到...析构函数的特征 1)析构函数的函数名是在类名前加上字符~ 2)析构函数无参数无返回值 3)一个类有且只有一个析构函数,如果...
    1. 为什么要使用析构函数?
      利用构造函数创建对象之后,程序负责跟踪该对象,直到其过期为止,对象过期时,程序将自动调用一个特殊的成员函数——析构函数。析构函数来完成一些清理工作,例如你用new来分配空间,则析构函数将使用delete来释放这些内存,否则有可能造成内存泄漏。

    2. 析构函数的特征
      1)析构函数的函数名是在类名前加上字符~
      2)析构函数无参数无返回值
      3)一个类有且只有一个析构函数,如果未定义,系统则会默认生成
      4)对象生命周期结束时C++编译系统自动调用析构函数
      5)注意析构函数内并未是删除对象而是做一些清理工作

    class Array{
    public:
        Array(int size){
        _ptr=(int*)malloc(size*sizof(int));
        }
        ~Array()//这里的析构函数完成清理工作(释放空间)
        {
       	 if(_ptr)
       	 {
       		 free(_ptr);
       		 _ptr=0;
       	 }
        }
    private:
       int *_ptr;
    };
    

    如果当你使用了内存而不释放,当你下次为一个变量申请空间时,就有可能申请到同一块内存空间而造成内存泄漏。

    展开全文
  • 析构函数

    2021-02-27 21:57:19
    析构函数 概念 前面通过构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没的呢? 析构函数:与构造函数功能相反,析构哈桑农户不是完成对象的销毁,局部对象下回工作是由编译器完成的。而对象在...
  • 析构函数(整理)

    2020-08-01 09:11:58
    析构函数的特征 命名方式:~<类名> 无返回类型(void)也没有(类似构造函数) 没有参数,因此不能被重载 没有明显定义时,系统调用默认析构函数 何时调用析构函数?当对象的生命周期结束时 示例要求: ...
  • C++类的析构函数

    2019-04-15 14:58:00
    一个类只有一个析构函数,且无显示定义,系统会生成一个缺省的析构函数(合成析构函数析构函数不能重载,其与构造函数一定是成对出现 作用: 构造函数相反,用于释放对象资源,并销毁非static成员。 程序...
  • C++——析构函数

    2020-10-26 21:07:31
    析构函数是特殊成员函数,特征为: 1.析构函数名是在类前面加上字符~ 2.无参数无返回值 3.一个类有且仅有一个析构函数,若未显示定义,系统会自动生成默认的析构函数 4.对象生命周期结束时,C++编译系统自动...
  • C++中的析构函数

    2016-10-02 14:33:09
    析构函数 概念: ... 析构函数的名字是由波浪线接类名构成,他没有返回值,也不接受参数,所以析构函数不能被重载。 注意:  析构函数和构造函数相同,构造函数有一个函数体和初始化部分,析构函数
  • C++ 1.3.3 析构函数

    2021-05-18 17:38:54
    1.析构函数 作用:在撤销对象是做一些内存清理工作。...2.析构函数的调用 (1)隐式调用 (2)显式调用:作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对
  • C++析构函数

    2017-02-11 18:30:21
    特征: a、析构函数在类名(即构造函数名)...若未显示定义,系统会自动生成缺省的析构函数。 d、对象生命周期结束时,C++编译系统系统自动调用析构函数。 e、注意析构函数体内并不是删除对象,而是做一些清理工作。
  • c++_析构函数

    2019-09-10 16:02:14
    与构造函数功能相反,析构函数不是完成对象销毁,局部对象销毁工作是由编译器完成。而对象在销毁时会自动调用析构函数,完成类一些清理工作。 2.特性 析构函数是特殊成员函数 特征析构函数名是在...
  • C++初遇析构函数

    2020-02-26 11:51:09
    析构函数是有一个特殊由用户定义公有成员函数,析构函数特征有: 析构函数名为:~<类名> 析构函数无任何函数返回类型说明 析构函数无参数,所以不能被重载 若类声明中没有给出析构函数,系统会自动给出一...
  • 一、构造函数与析构函数  1.构造函数的作用:初始化对象的数据成员。在类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化操作。 构造函数特征: 函数名与类名...
  • 1.下列哪一个是析构函数的特征() 正确答案: B A析构函数定义只能在类体内 (析构可以在类外定义) B一个类中只能定义一个析构函数 C析构函数名与类名不同 (要与类名相同, 前面加~) D析构函数可以有一个或多个...
  • 析构函数 前面通过:构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的? 1.概念 析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在...
  • 文章目录析构函数概念析构函数特性要点总结: 析构函数概念 前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的? 与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作...
  • 基类析构函数析不为虚函数 代码示例 效果图 基类析构函数析为虚函数 代码示例 效果图简要C++ 多态是它重要特征之一。而多态实现主要是通过基类指针指向子类对象。 而这个过程中容易出现一个问题就是,在...
  • 4.不能被继承(继承的是成员变量和成员函数,个人理解严格说这些构造函数,析构函数不能称之为“函数”,因为不符合函数定义的特征,所以构造函数,析构函数不能被继承) 5.可以手动调用(不理
  • 但构造函数与析构函数的两个特征都与此相违背: 1、构造函数与析构函数都不能被派生类继承。 2、构造函数和析构函数与所在类同名,所以他们在派生类和基类中的名字并不相同。 尽管如此,C++却允许析构函数定义为...
  • 析构函数的特征: 析构函数只能存在于类中,而不能存在于结构中;析构函数不能有任何修饰符,包括访问控制修饰符,静态修饰符,抽象修饰符,虚拟修饰符等都不能有;析构函数没有参数,这就意味着不能有任何重载。 ...
  • 4、不能被继承(继承的是成员变量和成员函数,个人理解严格说这些构造函数,析构函数不能称之为“函数”,因为不符合函数定义的特征,所以构造函数,析构函数不能被继承) 5、可以手动调用 【合成析构函数】关于...
  • C++析构函数使用virtual的原因介绍  ...类型需要虚析构函数的另外一个特征是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。通常,一个实现了析构函数的类型同

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 373
精华内容 149
关键字:

析构函数的特征