首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】揭秘类与对象的内在机制(核心卷之构造函数与析构函数的奥秘)

构造函数的函数名与类名相同,比如类名为Date,那么构造函数的函数名为Date()    2....,而动态申请的空间是来自堆的,这个时候就需要我们手动写析构函数来清理资源,如下: class Date { public: //日期类的实现......析构函数名是在类名前加上字符 ~ ,比如Stack类的析构函数函数名为 ~Stack    2. 析构函数无参数无返回值,跟构造函数类似,void也不需要写    3....⼀个类只能有⼀个析构函数,若未显式定义,系统会自动生成一个析构函数    4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数对资源进行释放    5....   那么今天构造函数与析构函数的分享就到这里结束啦,但是我们的核心卷还没有结束,在下一篇文章我们会详细介绍剩下的4种默认成员函数,即拷贝构造、赋值重载以及取址重载    bye~

7010

【C++指南】类和对象(三):类的默认成员函数——全面剖析: 析构函数

引言 在C++编程中,析构函数是一个特殊的成员函数,它在对象的生命周期结束时被自动调用,用于执行清理工作,如释放对象占用的资源、关闭文件、解除动态分配的内存等。...第⼆:编译器默认⽣成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现? 析构函数的特性 名称:析构函数的名称必须与类名相同,但前面有一个波浪号(~)。...对象作为类的成员被销毁时(例如,当包含该对象的另一个对象被销毁时) 默认析构函数的行为: 如果类没有显式定义析构函数,编译器会生成一个默认析构函数。...成员对象的析构:当一个对象被销毁时,它的成员对象(包括基类部分)的析构函数会按照它们被构造的相反顺序被调用。...调用成员对象的析构函数:如果对象包含其他对象作为成员,析构函数将自动调用这些成员对象的析构函数(按照成员变量在类中声明的逆序)。

19610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    计算机考研复试C语言常见面试题「建议收藏」

    +模板 4 10、内存泄漏 5 11、智能指针 6 12、野指针 7 13、new与malloc的区别 7 14、堆栈区 7 15、虚函数与纯虚函数 8 16、为什么析构函数必须是虚函数?...为什么C++默认的析构函数不是虚函数 8 17、函数指针 9 18、fork函数 9 19、类构造和析构顺序 9 20、静态函数和虚函数的区别 10 21、静态多态与动态多态 10 22、const修饰普通函数与成员函数的目的...为什么C++默认的析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。...C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。...19、类构造和析构顺序 构造: 基类成员对象的构造函数 基类的构造函数 子类成员对象的构造函数 子类的构造函数 析构: 子类的析构函数 子类成员的析构函数 基类的析构函数 基类成员的析构函数 两者正好相反

    1.7K30

    C++知识概要

    另外,virtual 函数是在不同类型的对象产生不同的动作,现在对象还没有产生,也就不能使用 virtual 函数来完成你想完成的动作 析构函数为什么要虚函数 C++中基类采用 virtual 虚析构函数是为了防止内存泄漏...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...构造函数析构函数可以调用虚函数吗 在构造函数和析构函数中最好不要调用虚函数 构造函数或者析构函数调用虚函数并不会发挥虚函数动态绑定的特性,跟普通函数没区别 即使构造函数或者析构函数如果能成功调用虚函数...为什么 C++空类的大小不为 0,不同编译器设置不一样,vs 设置为 1 C++标准指出,不允许一个对象(当然包括类对象)的大小为 0,不同的对象不能具有相同的地址 带有虚函数的 C++类大小不为...this 指针调用成员变量时,堆栈会发生什么变化 当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是 this 指针。

    1.1K20

    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...自身定义的 构造函数 ; 析构函数 : 自身 -> 成员 -> 父类 ; 首先 , 调用 自己 析构函数 ; 自身定义的 析构函数 ; 然后 , 调用 成员 析构函数 ; 也就是 成员变量 类型的...析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数...; 然后分析 析构函数 调用顺序 ; C 析构函数 , 是 自身构造函数 ; D 析构函数 , 是 成员构造函数 ; A 和 B 的析构函数 , 是 父类构造函数 ; 析构函数的调用顺序为 : 自身

    20510

    【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数

    析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。...所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。...但是:main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数。...目的是:在其内部调用Time类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁,main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数...注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数 6.

    21210

    【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 的 拷贝构造函数 与 析构函数 调用情况分析 )

    一、匿名函数 与 拷贝构造函数 1、匿名函数回顾 在上一篇博客 【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 ) 中 , 分析了匿名函数的几种用法..., 以及不同的使用场景下 , 匿名对象 的 创建与销毁情况 ; C++ 编译器 发现 使用 匿名对象 时 , 会根据 匿名对象 的用法 , 决定对 匿名对象的 处理 ; 匿名对象单独使用 : 如果只是单纯的使用...fun 函数中 , 函数返回对象值时 , 创建 要返回的 普通对象副本 , 也就是一个 匿名对象 ; 调用析构函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中的 普通对象...匿名对象 ; 调用析构函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中的 普通对象 需要被析构销毁 ; 调用析构函数 : m_age = 12 这是在 main 函数中..., 使用 匿名对象 为 普通变量赋值 , 需要将 匿名对象的值赋值给普通对象 , 匿名对象 之后直接销毁 , 这是调用析构函数 销毁 fun 函数返回的匿名对象 ; 学生信息 : 年龄 = 12 , 身高

    33920

    C++相关基础知识总结笔记

    (初始化列表,赋值效率更高) 执行必要的资源分配:例如,分配内存或其他资源。 对象的复制和移动:确保复制和移动操作的正确性。 析构函数 析构函数是一种特殊的成员函数,用于清理类的对象。...返回类型:析构函数没有返回类型,即使是 void 也不允许指定。 自动调用:当对象的生命期结束时(例如,对象离开作用域或删除动态分配的对象),析构函数会自动调用。...析构函数的规则 虚析构函数:如果希望在派生类中正确调用基类的析构函数,可以将基类的析构函数声明为虚析构函数。 例如,virtual ~BaseClass();。...成员清理:析构函数通常用于释放对象中分配的资源,例如释放动态分配的内存、关闭文件、撤销网络连接等。 析构函数的应用场景 释放资源:析构函数用于释放对象在构造时分配的资源。...虚析构函数的作用,没有虚析构会导致什么后果 虚析构函数(Virtual Destructor)是一个虚函数,用于确保当通过基类指针删除派生类对象时,派生类的析构函数也能被正确调用,没有虚析构会导致资源泄露

    21330

    C++面试题

    构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它但析构却不一定,我们往往通过基类的指针来销毁对象。...这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。...而子类析构函数具有析构掉基类的职责,所以不会造成内存泄漏。而基类并不知道自己的子类。 4. 构造函数和析构函数能抛出异常吗? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...C++的空类有哪些成员函数 默认构造函数、 默认拷贝构造函数、 默认析构函数、 默认赋值运算符,以及取址运算符和 const 取址运算符。 10. 虚函数表属于类还是对象?虚函数表什么内存空间?...所以,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。

    1.7K42

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    注意:构造函数不能为虚函数,但是析构函数可以为虚函数,并且虚析构函数可以防止父类指针销毁子类对象时不正常导致的内存泄漏。 12、C++中struct和class的区别?...static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问。...由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...将析构函数声明为虚函数,在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。

    2.2K20

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...2) 析构函数与构造函数的作用相反,用于撤销对象的一些特殊任务处理,可以是释放对象分配的内存空间;特点:析构函数与构造函数同名,但该函数前面加~。...2) 析构函数顺序 ① 调用派生类的析构函数; ② 调用成员类对象的析构函数; ③ 调用基类的析构函数。 79、虚析构函数的作用,父类的析构函数是否要设置为虚函数?...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

    2.4K40

    【C++】类和对象(中):类的默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

    析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束,栈帧销毁,他就释放了不需要我们管。C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。...析构函数特点: 1.析构函数名是在类名前加~。 2.无参数,无返回值。(和构造函数一样,连void也不需要写) 3.一个类只能有一个析构函数,若未显示定义,系统会默认生成析构函数。...4.对象生命周期结束时,系统自动调用析构函数。 5.跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构函数。...6.自定义类型不管我们写不写析构函数,他都会自动调用析构函数。 7.如果类中没有申请资源时,析构函数可以不写。(如日期Date类) 我们还是以栈Stack为例,写一个析构函数。...} 如果有多个对象,后定义的先析构。

    11910

    硬核 | C++ 基础大全

    **自动内存管理:**Java 程序中所有对象都是用 new 操作符建立在内存堆栈上,Java 自动进行无用内存回收操作,不需要程序员进行手动删除。...举例来说就是,一个基类的指针指向一个派生类的对象,在使用完毕准备销毁时,如果基类的析构函数没有定义成虚函数,那 么编译器根据指针类型就会认为当前对象的类型是基类,调用基类的析构函数 (该对象的析构函数的函数地址早就被绑定为基类的析构函数...如果基类的析构函数定义成虚函数,那么编译器就可以根据实际对象,执行派生类的析构函数,再执行基类的析构函数,成功释放内存。...析构函数与构造函数的作用相反,用于撤销对象的一些特殊任务处理,可以是释放对象分配的内存空间;特点:析构函数与构造函数同名,但该函数前面加~。...析构函数顺序 调用派生类的析构函数; 调用成员类对象的析构函数; 调用基类的析构函数。

    1.2K10

    .NET基础拾遗(1)类型语法基础和内存管理基础

    首先,struct(结构)是值类型,而class(类)是引用类型,所有的结构对象都分配在堆栈上,而所有的类对象都分配在堆上。   ...其次,struct与class相比,不具备继承的特性,struct虽然可以重写定义在System.Object中的虚方法,但不能定义新的虚方法和抽象方法。   ...(3).NET中的非托管堆   .NET程序还包含了非托管堆,所有需要分配堆内存的非托管资源将会被分配到非托管堆上。...Finalize方法类似于C++中的析构函数(方法),但又和C++的析构函数不同。...③CLR将有一个单独的线程负责处理“待析构的对象表”,其执行方法内部就是依次通过调用其中每个对象的Finalize方法,然后删除引用,这时托管堆中的对象实例就被视为不再被使用。

    66020

    嵌入式面试高频考点整理(建议收藏)

    「析构函数顺序」: 派生类本身的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反)。 用 C++设计一个不能被继承的类 将自身构造函数和析构函数声明为private。...而析构函数一般写成虚函数的原因[20] 构造函数不能声明为虚函数 因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。...,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了 析构函数最好声明为虚函数 首先析构函数可以为虚函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...析构函数的作用 对象消亡时,自动被调用,用来释放对象占用的空间。 栈和堆的区别,什么时候必须使用堆 栈:为函数分配的一块内存,函数内部声明的所有局部变量都将占用栈内存。

    75620

    CC++面试常问题集(2)

    假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以的,两者一个是与实例相关,一个是与类相关。 4....是C++的运算符; 对于非内部数据类型的对象(自己声明的类对象)而言,光用maloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc...delete[]删除一个数组,为每个数组元素调用析构函数;delete删除单个对象,只会调用一次析构函数。...简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。内部数据类型没有析构函数,所以问题不大。

    1.2K10

    C++学习知识点

    (3)尽量将基类的析构函数定义为虚函数,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。...析构子类对象时候,基类部分也会被析构! 8. 多态的理解 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。...编译器对虚函数的处理过程 C++中类的数据成员是独立的,每申明一次类的对象,就会为成员数据分配内存空间,所以成员数据变量存储在对象的空间中,成员函数是编译阶段确定存储空间和地址,故成员函数对于不同的对象是共享的...对于类定义对象什么时候用new,什么时候不用new的认识 (1) 构造函数只适用于类成员的初始化,与分配类对象的空间无关; (2) 隐式执行默认构造函数,初始化申明在栈上的类对象,直接申明,不要使用...返回的存放于堆中空间的首地址,需要类指针接收,如GPR* gpr=new GPR,此时调用默认构造函数,即无参构造函数。

    1.7K20

    C++ 万字长文第二篇---拿下字节面试

    空类的大小 在 C++ 中规定类的大小不为 0,空类大小为 1,当类不包含虚函数和非静态成员时,其对象大小也为 1。若存在虚函数,则需要存储一个虚函数指针大小,在 32 位上为 4 字节。...static 修饰成员函数 静态成员函数在 代码区 分配内存。静态成员函数和非静态成员函数的区别在于非静态成员函数存在 this 指针,而静态成员函数不存在,所以静态成员函数没有类对象也可以调用。...操作方法就是在 B 和 C 的继承处加上 virtual 修饰。 虚继承底层实现一般通过虚基类指针和虚基类表实现。每个虚继承的子类都有一个虚基类指针和一个虚基类表,虚表中记录了虚基类与本类的偏移地址。...静态建立由用户为对象分配内存,通过 new 来实现,间接调用构造函数。这种方法创建的对象会在堆上。 只能从堆上分配对象: 当建立的对象在栈上时,由编译器分配内存,因此会涉及到构造函数和析构函数。...但这种方法存在一种缺点,就是把析构函数设成 private 后,如果这个类要作为基类的话,析构函数应该设成虚函数,而设成 private 后子类就无法重写析构函数,所以应该把析构函数设成 protected

    1.4K20

    《逆袭进大厂》之C++篇49问49答

    malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。...static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问 const...33、为什么析构函数一般写成虚函数 由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。

    2K10

    C++内存分区模型分析与实例以及扩展

    ,因此构造函数相当于一个入口点,这个入口点负责虚函数调用的前期工作,这个入口点当然不可能是虚函数;8,析构函数可以成为虚函数: 1,析构函数在对象销毁之前被调用,对象销毁之前意味着虚函数指针是正确的指向对应的虚函数表的...; 2,建议在设计类时将析构函数声明为虚函数(工程中设计一个父类的析构函数为虚函数); 1,赋值兼容性申请子类对象给父类指针时,当 delete 作用在指针上时,编译器会直接根据指针类型(此时是父类...)来调用相应的析构函数,若父类加上 virtual,编译器可以根据指针指向的实际对象(此时是子类)决定如何调用析构函数(多态);9,构造、析构、虚函数编程实验:#include #include...delete p; // 期望调用完子类析构函数再调用父类的析构函数;但是如果父类没有申请为析构函数,则只调用父类析构函数;这是因为此时删除的是一个父类的指针,由于并没有将析构函数申请为 virtual...编译器就不会简单的根据指针 p 的类型来简单调用父类的或者是子类的析构函数了,这个时候由于析构函数是虚函数,所以在执行这行代码的时候,编译器会根据指针 p 指向的实际对象来决定如何调用析构函数,这是多态

    79841
    领券