0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++学习之析构函数和const总结

电子设计 来源:电子设计 作者:电子设计 2020-12-24 17:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,今天再次写c++的文章,首先给各位网友说明一下这段时间为啥都是写c++的文章,没有Linux的文章;原因是这样的,自己立了一个flag,八月份把c++的基本语法全部过完(目前完成三分之一),所以文章过程中我写的可能没有很详细的解释一些概念;所以文章中有不理解的地方,可以私聊我,我会尽力解答好。同时昨天遇到一位刚高考完的网友,人家都这么努力学习,你还打酱油吗?

一、对象的析构顺序:

在上一篇文章里面,已经介绍过对象的构造顺序,既然有对象的产生,那么就会有对象的消亡;换句话说,有资源的分配,最终系统就要收回这些分配出去的资源。所以也就有了对象的析构顺序用法了。下面我们来看一下对象析构顺序的分类,不过这里我们先来看构造对象调用构造函数的来引出对象析构的顺序:

(1)单个对象创建时构造函数的调用顺序:

调用父类的构造过程(这个概念暂时还没学,先不用管)

调用成员变量的构造函数(调用顺序与声明顺序相同)

调用类自身的构造函数

引出:析构函数与对应的构造函数的调用顺序相反,也就是对象构造与对象析构(消亡)的顺序相反。

(2)代码演示:

#include <stdio.h>

class Test{ const char * i; public: Test(const char *s) { printf("Test(const char *s) is %s",s); i=s; } ~Test() { printf("~Test() is %s",i); }};

class Test2{ Test mA; Test mB; public: Test2():mB("mB"),mA("mA") { printf("Test2()"); } ~Test2() { printf("~Test2()"); }};

Test gA("gA");

int main(){ Test2 t;
return 0;}

演示结果:

Test(const char *s) is gATest(const char *s) is mATest(const char *s) is mBTest2()~Test2()~Test() is mB~Test() is mA~Test() is gA

说明:从运行结果,我们可以看到先触发全局对象的构造函数,然后是触发初类Test2里面的mA和mB对象的构造函数,最后触发局部对象的构造函数,然后进行析构,我们可以看到,析构顺序完全和构造顺序相反。非常类似于栈的操作规则,栈是先入栈,却是最后出栈。

二、const关键字可以修饰类的对象嘛?

1、这个问题答案肯定是可以修饰的,为啥这么说呢?不知大家还是记得c语言里面的struct关键字不,在之前的文章里面也学习过,使用struct关键字也可以来构造类名,只不过他的所有成员都是公开的(public);换句大家好理解的话,就是结构体,那么在c语言里面,const关键字肯定是可以修饰结构体变量的,当然在c++里面肯定也是可以的,c++不是取代c语言的,而是对c语言进行扩展着,并且兼容c语言的。不过const修饰的对象有啥特性呢?

const修饰的对象特性:

const修饰的对象为只读对象

只读对象的成员变量不允许被改变

只读对象是编译阶段的概念,运行时无效

代码示例:

#include <stdio.h>

class Test{ int mi;public: int mj; Test(int i); Test(const Test& t); int getMi();};

Test::Test(int i){ mi = i;}

Test::Test(const Test& t){

int Test::getMi(){ return mi;}

int main(){
const Test t1(1);
t1.mj = 100; printf("the t1.mj is %d",t1.mj);
return 0;}

运行结果:

test.cpp: In function ‘int main()’:test.cpp:34:10: error: assignment of member ‘Test::mj’ in read-only object t1.mj = 100;

分析:我们可以看出public里面的属性mj是不能修改的,为只读的,因为类对象被const修饰了。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    526

    浏览量

    45308
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76716
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    运行代码进行分离,使得程序更加模块化;另一方面,C++的异常处理可以不需要异常处理在异常发生时的同一个函数,而是可以在更上层合适的位置进行处理。 下面,我们一起来看看C++的异常处理。 2、异常处理
    发表于 12-02 07:12

    强实时运动控制内核MotionRT750(六):us级高速交互C++,为智能装备提速

    Windows下运动控制实时内核MotionRT750的高速交互C++
    的头像 发表于 09-04 14:50 493次阅读
    强实时运动控制内核MotionRT750(六):us级高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,为智能装备提速

    多次运行AIBase中的函数出现意外掉线的情况,怎么解决?

    第一次运行无异常,但是第二次运行这里会意外掉线,try+catch同样无法捕捉,大家如何yolo的? 目前解决办法就是注释掉这段代码,不释放是否会出现问题,虽然暂时没发现异常
    发表于 08-14 07:10

    在OpenVINO™ C++代码中启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码中启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。 本文档展示了如何使用 lockzhiner_vision_module::vision
    发表于 06-06 14:43

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。本文档展示了如何使用lockzhiner_vision_module::PaddleDet类进行目标检测,并通过lockzhiner_vision_module::Visualize函数
    的头像 发表于 06-06 13:56 609次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b>目标检测

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的256kRAM
    的头像 发表于 05-21 10:33 782次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动I2C驱动构建流程

    _adapter *);int (*detach_adapter)(struct i2c_adapter *);int (*probe)(struct i2c_client *, const struct
    发表于 04-15 10:37

    带你在单片机编程中熟练使用const(可下载)

    C 语言关键字中 const 举足轻重,我们今天就深度聊一聊 const 的定义和实际应用,让它 不再是迷C 语言中 const 关键字
    发表于 04-01 14:18 3次下载

    C++学到什么程度可以找工作?

    C++开发的工作不仅需要深厚的编程功底,还要具备解决实际问题的能力,以及良好的沟通能力和团队协作精神。此外,持续学习和更新自己的知识体系也是保持竞争力的关键。
    发表于 03-13 10:19

    基于OpenHarmony标准系统的C++公共基础类库案例:ThreadPoll

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础类库的线程池处理:ThreadPoll。本案例完成如下工作:创建1个线程池,设置该线程池内部有1024个线程空间。启动5个线程
    的头像 发表于 02-10 18:09 603次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:ThreadPoll

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序中。Spire.XLS for C++ 提供了一个对象模型 Excel
    的头像 发表于 01-14 09:40 1302次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-112:模拟C++中的类实现

    电子发烧友网站提供《EE-112:模拟C++中的类实现.pdf》资料免费下载
    发表于 01-03 15:15 0次下载
    EE-112:模拟<b class='flag-5'>C++</b>中的类实现

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    /C++代码快速迁移至HarmonyOS NEXT。凭借卓越的兼容性,AKI已成为厂商与开发者打造鸿蒙原生应用过程中广泛使用的跨语言调用解决方案。 AKI是一款专为鸿蒙原生开发设计的FFI(外部函数接口
    发表于 01-02 17:08

    运动控制卡周期上报实时数据IO状态C++

    使用C++进行运动控制卡的周期上报功能实现
    的头像 发表于 12-17 13:59 1534次阅读
    运动控制卡周期上报实时数据IO状态<b class='flag-5'>之</b><b class='flag-5'>C++</b>篇