精华内容
下载资源
问答
  • 析构函数作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
  • 本篇文章是对C++中虚析构函数作用进行了详细的分析介绍,需要的朋友参考下
  • c++析构函数作用

    2014-10-09 12:26:53
    析构函数与构造函数一般是同一个话题。构造函数


    析构函数与构造函数一般是同一个话题。构造函数与析构函数的执行顺序刚刚好相反。在类里面的继承关系更为之显著。

     class Studnet{
            Student(int s,int n){...}
                ~Student(){cout<<"Student XG";}
    };
    
    class Universe:public Student{
          public:
               Universe(int q,int w){...}
               ~Universe(){cout<<"Universe XG";}
    
    };                            //构造函数的执行顺序是 基类->子类;析构函数的执行顺序是  子类—>基类;需要提醒的是这个是对于子类与基类的关系;                                                             对于两个不相关的类的
    对于c++基础,贯彻全部内容的就是   析构函数和构造函数   的执行顺序【(当然像 继承 封装 多态;还是再简单的提及一下吧,毕竟这是博文写的就是c++学习笔记)

    继承 :private(私有继承),protected(保护基础),public(公有继承)

    class A{   private:.........

    public:.......

    protected:.......};   

    class B:privatA{ private:.........

    public:.......

    protected:.......}; //基础的就不说了,说些需要注意的:无论是私有还是公有还是保护继承,基类的私有始终只是基类所特有的(即无法继承private的东西)。你继承来的只能是基类里protected,和 public 的;

    public继承基类里的公有和保护的(public 继承,基类 公有的还是继承为公有的,私有的还是继承为私有的);

    protected继承:基类里的public 和protected 到了 派生类 就变成 protected;

    private继承:基类里的public和protected 到了派生类就成  private;

    (继承是把基类的以 protected(例如) 把全部(基类的public和protected)可以继承的 继承为  (protected));


    多态:说白了就是重载和虚函数(virtual)



    回到正题:析构函数 和构造函数的顺序

           以为后头的很多虚函数 普通函数 重载函数 。。。运算符重载 。。。。继承。。。。。

          都有很多的  析构函数和构造函数的考究

    记得你头疼,但是呢你知道原理之后一切就变得有趣了,有规律可循;

    c++是一种编译环境  不是一门语言(这句话是一位;老师强调的,因为c++延续了很多c语言的语法,而且很多语法都可以用,是编译器里写好的一些规则,对这句话有异议的可以留言大家探讨下)

    噢对了那个规律呢,就是你要知道 编译器是怎么解读 c++代码的: windows 系统的  vc++6.0 和 linux 的gcc  都是目前最流行的c++编译器,他对析构函数的存储呢

    是用堆栈的形式 ;在main函数里,你生成一个对象就把析构函数入栈。等到你程序跑完,return 0;

    后 就开始读取堆栈里的析构函数对对象进行析构;离return 语句最近的那个  对象是最后才入栈的,先进后出。所以他是最先进行析构的;(讲了这么多呢要讲的就是这个,其它的具体规则都可以在网上搜索到,所以我说的只是这个思想)


    展开全文
  • 主要介绍了C++中虚析构函数作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,...

      在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。
      这里是一个例子:
      class awov {
      public:
      virtual ~awov() = 0; // 声明一个纯虚析构函数
      };
      这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:
      awov::~awov() {} // 纯虚析构函数的定义
      这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。

    转载于:https://www.cnblogs.com/byfei/archive/2012/06/28/3112251.html

    展开全文
  • 1、类中所有的成员函数都是纯虚函数,2、没有定义成员变量。 因为接口只负责描述类的行为和功能,不需要实现,而是由它的派生类来实现。 至于普通抽象类,只要有一个成员函数被声明为纯虚函数,那它就是抽象类,这...

    接口是一种编程思想,定义了一种编程规范,同时可以增强扩展性(多态),在C++中,某些抽象类也称为接口类,声明一个接口类需要满足以下几个条件:

    1、类中所有的成员函数都是纯虚函数,2、没有定义成员变量。

    因为接口只负责描述类的行为和功能,不需要实现,而是由它的派生类来实现。

    至于普通抽象类,只要有一个成员函数被声明为纯虚函数,那它就是抽象类,这是和接口不一样的地方。

    一、接口的实现

    class Interface {
    public:
    	virtual ~Interface() {
    		cout << "Interface 析构" << endl;
    	}
    
    	virtual void say() = 0; //纯虚函数
    };

    上面定义了一个接口Interface,可以看到,我们不需要声明它的构造函数,因为抽象类无法被实例化。

    接口作用:订制一种规范,即子类必须实现这些接口。

    二、声明虚析构函数的目的

    1、当被派生类继承后,它的指针指向派生类时,删除它的指针(基类),会先调用子类的析构函数,再调用自己的析构函数。

    如下,将接口的虚析构函数注释掉:

    #include <iostream>
    
    using namespace std;
    
    class Interface {
    public:
    	//virtual ~Interface() {
    	//	cout << "Interface 析构" << endl;
    	//}
    
    	virtual void say() = 0; //纯虚函数
    };
    
    class Test : public Interface
    {
    public:
    	Test() {}
    	~Test() {
    		cout << "Test 析构" << endl;
    	}
    	virtual void say() {
    		cout << "Im Test" << endl;
    	}
    };
    
    int main()
    {
    	Interface *f = new Test;
    	f->say();
    	delete f;
    
    	getchar();
    	return 0;
    }
    

    输出:

    可以发现,无法析构子类Test,会造成内存泄漏。

    展开全文
  • C++中虚析构函数作用及其原理分析

    万次阅读 多人点赞 2017-03-15 00:13:04
    C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的...

    参考http://blog.csdn.net/xiamentingtao/article/details/55517203

    C++中的虚析构函数到底什么时候有用的,什么作用呢。
    一.虚析构函数的作用
    总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的.

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:

    #include<iostream>
    using namespace std;
    
    class ClxBase
    {
        public:
            ClxBase() {};
            virtual ~ClxBase() { cout<<"delete ClxBase"<<endl; };
    
            virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl;  };
    
    };
    
    class ClxDerived : public ClxBase
    {
        public:
            ClxDerived() {};
            ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl;  };
    
            void DoSomething() { cout << "Do something in class ClxDerived!" << endl;  };
    
    };
    
    int main(int argc, char const* argv[])
    {
         ClxBase *pTest = new ClxDerived;
         pTest->DoSomething();
         delete pTest;
        return 0;
    }

    这里写图片描述
    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
    这里写图片描述
    没有调动子类的析构函数
    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

    总结一下虚析构函数的作用:
    (1)如果父类的析构函数不加virtual关键字
    当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
    (2)如果父类的析构函数加virtual关键字
    当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
    二.虚析构函数的原理分析

    #include<iostream>
    using namespace std;
    
    class Base
    {
    public:
        Base(){cout<<"create Base"<<endl;}
        virtual ~Base(){cout<<"delete Base"<<endl;}
    };
    
    class Der : public Base
    {
    public:
        Der(){cout<<"create Der"<<endl;}
        ~Der(){cout<<"Delete Der"<<endl;}
    };
    int main(int argc, char const* argv[])
    {
        Base *b = new Der;
        delete b;
    
        return 0;
    }

    从创建讲起,用gdb调试你会发现,
    (1)先调用父类的构造函数,再调用子类的构造函数,

    这里有一个问题:父类的构造函数/析构函数与子类的构造函数/析构函数会形成多态,但是当父类的构造函数/析构函数即使被声明virtual,子类的构造/析构方法仍无法覆盖父类的构造方法和析构方法。这是由于父类的构造函数和析构函数是子类无法继承的,也就是说每一个类都有自己独有的构造函数和析构函数。

    (2)而由于父类的析构函数为虚函数,所以子类会在所有属性的前面形成虚表,而虚表内部存储的就是父类的虚函数

    即使子类也有虚函数,但是由于是单继承,所以也只有一张虚表,这在上一篇博客多态中讲到过。
    执行 Base *b = new Der;之后b的最终形态
    这里写图片描述

    (3)当delete父类的指针时,由于子类的析构函数与父类的析构函数构成多态,所以得先调动子类的析构函数;之所以再调动父类的析构函数,是因为delete的机制所引起的,delete 父类指针所指的空间,要调用父类的析构函数。
    所以结果就是这样
    这里写图片描述

    展开全文
  • 构造函数与析构函数

    2016-02-16 14:46:56
    析构函数在对象超出作用范围或使用delete运算符释放对象时被调用,用于释放对象占用的空间。如果用户没有显式地提供析构函数,系统会提供一个默认的析构函数析构函数也是以类名作为函数名,与构造函数不同的是在...
  • 析构函数 用于释放在构造函数或在对象生命期内获取的资源。 如果类需要析构函数,...当对象的引用或指针超出作用域时,不会运行析构函数,只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用...
  • c++析构函数

    2021-01-07 18:55:14
    在main函数中创建了t0,t1,t2,t3几个对象,这里先说一下C++创建对象的三种不同方式: 1、Test p1(1); //栈中分配内存 2、Test p2 = Test(2); //栈中分配内存,跟方法1相同,是方法1的完整模式 3、Test *p3 = new ...
  • C++ 虚析构函数作用

    2020-02-04 11:46:47
    类的析构函数作用 类的析构函数是为了释放内存资源,析构函数不被调用的话就会造成内存泄漏。 虚析构函数 定义为虚析构函数是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。 但并不是...
  • 析构函数作用

    2020-02-28 12:17:57
    析构函数作用就是用父类指针或者引用释放所有的子类资源。 在没有使用虚析构函数的情况下,因为c++是静态联编语言,其指针是什么类型,就默认为指针指向的是什么类型,因为这样做是绝对安全的,我也非常支持...
  • 析构函数的一些特点

    千次阅读 2017-10-18 20:19:47
    完成的工作: 类似构造函数有一个初始化部分和一个函数体部分,析构函数也有一个函数体和一个析构部分。构造函数中,先进行成员的初始化,再执行函数体;而在析构函数中,是先执行函数体,后销毁成员。成员按初始化...
  • 析构函数

    千次阅读 2021-01-17 17:48:57
    析构函数也是一个在类中跟构造函数类似的特殊功能的成员函数,作用与构造函数相反,是在对象的声明周期结束的时候会被自动调用.在C++中析构函数的名字跟类名相同,并在前面带上一个取反的符号~,表达的意思也跟构造...
  • 类的析构函数

    2020-02-24 18:46:25
    构函数的规则:析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号~作为前缀。 析构函数的名称与其所属类的名称相同,只是名称前使用了符号”~“ 析构函数没有返回类型,它不会返回任何值,也不能带有...
  • 在C++中“~”是位“取反”运算符,从这一点可以想到:析构函数是与构造函数作用相反的函数。例如: class student{ public: student()//构造函数 { } ~student() //析构函数 { } void print(){} };...
  • 函数的主要作用是建立抽象模型,从而可以达到方便扩展系统的目的。纯虚函数是是一种特殊的虚函数,可以说是虚函数的子集,它可以不需要再基类中写函数实现,而虚函数不写函数实现就会报错。 为啥会有虚函数? ...
  • 今天我们来谈一谈面试 C++ 工程师时经常被谈到的一个问题:为什么析构函数必须是虚函数?为什么默认的析构函数不是虚函数? 首先,我们看一下百度百科对虚函数是怎么定义的: 在某基类中声明为 virtual并在一个或多个...
  • C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的...
  • 析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。...
  • C++中虚析构函数和纯虚函数的作用

    千次阅读 多人点赞 2017-12-26 23:38:10
    析构函数为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。class Base { public: Base(){} ...
  • 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。 C++默认的***析构函数不是虚函数是因为虚函数需要...
  • C++析构函数

    2019-09-23 08:45:21
    C++析构函数 一、认识析构函数 析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。 同样的,我们来看看析构函数的几个特点: 函数...
  • 为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的...
  • 在没有虚析构函数的情况下
  • C++中析构函数作用

    2021-02-01 17:30:47
    析构函数作用析构作用类析构顺序 析构作用 析构函数与构造函数对应,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统 会自动执行析构函数析构函数名也应与类名相同,只是在函数名前面加一个位取反符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,709
精华内容 28,283
关键字:

析构函数的作用