C++八股记录

这篇具有很好参考价值的文章主要介绍了C++八股记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++内存管理

        C++中,内存分成5个区。

        栈:函数内局部变量;自动管理,效率高,但空间较小;

        堆:new分配的内存块;手动管理,效率低,但空间大;

        自由存储区:malloc分配的内存块;

        静态/全局存储区:全局变量、静态变量;

        常量存储区:常量。

new / delete 和 malloc / free

  • 本质上:new和delete是操作符,malloc和free是库函数
  • 实现上:malloc将堆的特定段空间申请出来,new(1)调用operator new(C++的全局函数),(2)运行相应的构造函数以构造数据类型,并为其传入初值,(3)对象构造完成后,返回一个指向该数据类型的指针。对应的,delete也要先运行析构函数,再释放空间;
  • 内存上:malloc申请的空间在堆上,new申请的空间在自由存储区(有些编译器new在底层的写法就是采用malloc来实现,所以也有一些说法说new申请的空间也在堆上,这也说明自由存储区可以在堆上,但不等同于堆)。
  • 分配失败:new抛出异常,malloc返回NULL;
  • 返回值类型:new不需要类型转换,malloc是void*,需要类型转换;
  •  其它:new可以重载,malloc不能;new不支持已分配内存的扩张,malloc支持。

static

        修饰变量:

  • 放在静态存储区;
  • 修饰全局变量:不能被其它文件所用,其它文件中可以定义相同名字的变量,不会发生冲突;
  • 修饰局部变量:局部变量每次的值保持到下一次函数调用;
  • 修饰类的成员变量:该变量与类绑定,而不再与实例绑定,所有该类的实例(包含子类的实例)公用该变量;

        修饰函数:

  • 修饰一般函数:静态函数不能被其它文件所用,其它文件中可以定义相同名字的函数,不会发生冲突;
  • 修饰类的成员函数:
  1. 普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。静态成员函数不具有this指针,所以也无法访问属于类对象的非静态数据或函数,只能访问其它静态成员变量和函数;
  2. static成员函数不能被virtual修饰。

const

  • 修饰一般变量:变量不可变,存储在常量区;
  • 修饰指针:指针指向的内容不可变;
  • 修饰类的成员变量:成员常量,不能修改,它只能在初始化列表中赋值;
  • 修饰成员函数:实质上修饰的是成员函数影藏得this指针,表示该成员函数不能对类的成员变量做修改。
  • 和define区别:

C++八股记录,c++,jvm,开发语言

extern

  • 修饰当前文件的全局变量:使得该全局变量在定义点之前就能被引用,使其作用域提前;
  • 修饰其它文件的全局变量:想引用另外一个源文件中已经定义的外部变量。

多态和虚函数:

        C++通过虚函数实现。只要含有虚函数的类就会为该类生成一个全局唯一虚函数表,虚函数表中记录类中虚函数的入口地址,同时会在每个实例内存的开始生成一个虚函数表指针,指向虚函数表。

        而当一个子类继承一个有虚函数的父类后,同时也会继承父类的虚函数表,如果子类重写了一个虚函数,就会把虚函数表中该虚函数的地址改成重写后的版本。

        这样一个父类指针指向一个子类对象,想要调用某虚函数时,通过对象内存地址找到的是子类虚函数表,就可以调用子类的版本。这就实现了多态,即一个父类指针指向不同对象,调用相同的函数,表现出不同的形态。

struct和union

  • struct:成员占用的内存空间独立,大小是累加的;
  • union:所有的成员共用一块地址空间。

引用和指针

  • 引用:变量的别名;
  • 指针:一个变量,存放地址。

野指针

        指针变量没有被初始化;

        指针被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针;

        指针操作超越了变量的作用域范围。

构造函数和析构函数

C++八股记录,c++,jvm,开发语言文章来源地址https://www.toymoban.com/news/detail-693035.html

到了这里,关于C++八股记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我的面试八股(JVM篇)

    Java内存区域和Java内存模型 不是一个东西 !!!!! Java内存区域,也就是 Java运行时数据区域 。是指Java虚拟机在运行时创建的一个内存区域,用于存储Java程序运行时所需要的数据结构和对象实例。Java运行时数据区包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等部

    2023年04月16日
    浏览(38)
  • 一天吃透JVM面试八股文

    JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由 一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等 组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的

    2023年04月19日
    浏览(47)
  • 【java八股文】之JVM基础篇

    【java八股文】之JVM基础篇-CSDN博客 【java八股文】之MYSQL基础篇-CSDN博客 【java八股文】之Redis基础篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多线程篇-CSDN博客 【java八股文】之JVM基础篇-CSDN博客 【java八股文】之计算

    2024年01月17日
    浏览(39)
  • java八股文面试[JVM]——元空间

    JAVA8为什么要增加元空间 为什么要移除永久代?    知识来源: 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili

    2024年02月11日
    浏览(51)
  • java八股文面试[JVM]——垃圾回收

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收 面试题: JVM内存模型 以及分区,需要详细到每个区放什么 堆里面的分区:Eden,survival from to,老年代,各自的特点。 GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方 针

    2024年02月11日
    浏览(43)
  • java八股文面试[JVM]——双亲委派模型

    1.当 AppClassLoader 去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器 ExtClassLoader 去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载器 BootstrapClassLoader 去完成。 3.如果BootstrapClas

    2024年02月11日
    浏览(54)
  • java面试八股文_虚拟机篇(jvm)

    要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译 源代码(java Source) 为 字节码 执行 java 命令 创建 JVM,调用类加载子系统加载 class,将类的信息存入 方法区 创建 main 线程,使用的内存区域是 J

    2023年04月08日
    浏览(44)
  • java八股文面试[JVM]——垃圾回收器

    jvm结构总结   常见的垃圾回收器有哪些?     CMS(Concurrent Mark Sweep) 整堆收集器 : G1 由于整个过程中 耗时最长 的 并发标记 和 并发清除 过程中,收集器线程都可以与用户线程一起工作,所以 总体上来说 ,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收

    2024年02月11日
    浏览(44)
  • C++项目开发编译踩坑记录

    问题现象:使用git clone命令从库上下载下来的代码,使用VS 2022编译,全文报语法错误,但是代码他其他同事电脑上都能正常编译通过。 期间一度以为是本人电脑上的C++编译环境配置有问题,尝试过卸载掉VS软件重新安装、新增安装VS组件等的方式,最后都无法解决问题,故排

    2024年02月22日
    浏览(39)
  • MySQL八股学习记录6-日志from小林coding

    undo log:InnoDB存储引擎层生成的日志,实现事务中的原子性,主要用于事务回滚和MVCC redo log:InnoDB存储层生成的日志,用于事务的持久化,用于掉电等故障恢复 binlog:server层生成的日志,用于数据备份和主从复制 执行一条增删改语句的时候,不显式的输入begin和commit开启事务,MySQL也会隐式

    2024年02月17日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包