首页 > 编程语言 >C++对象的创建和销毁过程分析

C++对象的创建和销毁过程分析

时间:2023-08-24 19:22:18浏览次数:40  
标签:销毁 对象 创建 成员 构造 C++ 析构 父类

对象的创建和销毁过程分析

1、对象的创建过程

①给对象划分内存空间(栈、堆)

②执行初始化列表

  • 根据继承表的顺序调用父类的无参构造或有参构造
    通过:父类(val)调用父类的有参构造

  • 根据成员变量的定义顺序调用类类型成员的无参构造或有参构造

通过:类类型成员名(val)调用类类型成员的有参构造

  • 对其他成员初始化

③执行自己的构造函数、可能去申请额外资源

2、对象的销毁过程(创建的逆序)

①执行自己的析构函数、可能去释放资源

②根据类类型成员顺序的逆序,调用他们的析构函数

③根据继承表的顺序,调用父类的析构函数

④释放对象的内存

实例:

    #include<iostream>
    using namespace std;
    class A
    {
    public:
        A(void)
        {
            cout << "A无参构造" << endl;
        } 
        A(int num)
        {
            cout << "A的有参构造" << endl;
        }  
        ~A(void)
        {
            cout << "A的析构函数" << endl;
        }     
    };

    class B
    {
    public:
        B(void)
        {
            cout << "B无参构造" << endl;
        } 
        B(int num)
        {
            cout << "B的有参构造" << endl;
        }  
        ~B(void)
        {
            cout << "B的析构函数" << endl;
        }     
    };

    class C
    {
    public:
        C(void)
        {
            cout << "C无参构造" << endl;
        } 
        C(int num)
        {
            cout << "C的有参构造" << endl;
        }  
        ~C(void)
        {
            cout << "C的析构函数" << endl;
        }     
    };

    class D
    {
    public:
        D(void)
        {
            cout << "D无参构造" << endl;
        } 
        D(int num)
        {
            cout << "D的有参构造" << endl;
        }  
        ~D(void)
        {
            cout << "D的析构函数" << endl;
        }     
    };

    class E : public B,public A
    {
        C c;
        D d;
    public:
        E(void)//:A(20),B(20),c(20),d(20)初始化列表,调用有参构造
        {
            cout << "E无参构造" << endl;
        } 
        ~E(void)
        {
            cout << "E的析构函数" << endl;
        }     
    };

    int main(int argc,const char* argv[])
    {
        E* e = new  E;    //BACDE
        delete e;    //先申请的后释放(栈)    EDCAB
    }

标签:销毁,对象,创建,成员,构造,C++,析构,父类
From: https://www.cnblogs.com/ljf-0804/p/17654984.html

相关文章

  • C++面向对象、类和对象、访问控制限定符
    面向对象和面向过程面向过程:关注如何解决问题,以及解决问题的步骤面向对象:关注的解决问题的"人"即"对象",以及实现能解决问题的"对象"注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题面向对象的四个特性:抽象:先找出(想象)......
  • Windows中通过C++自动添加防火墙例外规则
    在C++程序中无法直接控制防火墙警报窗口的显示,因为这是由操作系统和防火墙软件控制的。防火墙警报窗口是为了提醒用户程序正在尝试与外部网络进行通信,以确保用户意识到可能的网络活动。然而,可以通过编写C++程序在用户的系统上自动添加防火墙例外规则,从而避免防火墙警报窗口的显示......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • 创建web应用程序,React和Vue怎么选?
    React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。毫无疑问,React是创建跨平台解决方案的最佳框架......
  • 类的创建和继承
    //类的定义//定义一个动物类functionAnimal(name){//属性this.name=name||"Animal"//实例方法this.sleep=function(){console.log(this.name+'在睡觉')}}//原型方法Animal.prototype.eat=function(food){console.log(this.name+&quo......
  • C++内联函数、引用、强制类型转换
    三、内联函数inline1、普通函数普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回2、什么是内联函数内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内......
  • 在Windows系统中搭建C++刷算法题环境
    下载Docker首先,到Docker官方网站下载适合Windows系统的DockerDesktop并安装。下载Ubuntu镜像使用如下命令安装Ubuntu最新镜像:dockerpullubuntu在镜像中搭建C++编译环境使用如下命令启动一个ubuntu容器:dockerrun-itd--nameubt-cpp-v/d/code/algo:/dataubuntu使......
  • C++虚函数、虚继承:virtual
    ​1.引子在类的继承当中曾经出现过这样一种情况:B、C继承自A,D继承自B和C。 之前提到过,这种情况下,关于类A当中的内容,会被复制成两份给到D,当进行访问的时候,需要指定C或者B,才能够定位到A当中的变量是来自哪里。就像下面这样。​ 代码表示:classA{public:A(int......
  • C++类与对象(二)
    一、类的默认成员函数类内的默认成员函数:用户不显示实现,编译器就会自动生成的成员函数,被称为类的默认成员函数。这些默认成员函数各有各存在的作用。但实际上,很多时候,需要自己写这些成员函数,而不是使用编译器生成的。翻译一下就是,在类内有这样六个成员函数,如果你不写,编译器就会自动......
  • C++笔记
    C++笔记将数字以十六进制输出:cout<<hex<<100<<endl;将数字以八进制输出:cout<<oct<<100<<endl;精度控制include保存a位小数:setprecision(a)将b保留a位:cout<<setprecision(a)<<b<<endl将b保留小数点后a位:cout<<setiosflags(ios::fixed)<<se......