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区别:

extern

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

多态和虚函数:

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

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

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

struct和union

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

引用和指针

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

野指针

        指针变量没有被初始化;

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

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

构造函数和析构函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弯道超车必做好题集锦三(C语言选择题)

前言: 编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,每篇大约10题左右。此为第三篇选择题篇,该系列会不定期更新,后续还会…

全面解析MES系统中的报工操作

一、报工操作的定义: 报工操作是指在生产过程中,操作员通过MES系统记录和提交生产工序的相关信息,如工时、产量、质量等。报工操作将生产过程中的实际情况反馈给MES系统,实现生产数据的实时采集和记录。 二、报工操作的流程&…

MacOS goland go1.21 debug问题

安装dlv brew install dlv 安装之后在终端会显示所在目录 类似/usr/local/Cellar/delve/1.21.0/bin 配置goland 在文件系统中找到goland 右击选择show package contents -> Contents -> plugins -> go 尝试替换 其中对应系统 的 dlv 结果还是不行 然后打开应用gol…

常见前端面试之VUE面试题汇总七

20. 对 vue 设计原则的理解 1.渐进式 JavaScript 框架:与其它大型框架不同的是,Vue 被设计 为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上 手,还便于与第三方库或既有项目整合。另一方面,当与现代化的…

universal robot 机械臂 官方基本教程

https://academy.universal-robots.cn/modules/e-Series-core-track/Chinese/module3/story_html5.html?courseId2166&languageChinese 教程1 控制箱内部 包含: 主机板,SD卡,和安全控制板 安全控制板负责所有控制信息,包括…

LeetCode(力扣)617. 合并二叉树Python

LeetCode617. 合并二叉树 题目链接代码 题目链接 https://leetcode.cn/problems/merge-two-binary-trees/ 代码 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

【springboot】springboot定时任务:

文章目录 一、文档:二、案例: 一、文档: 【cron表达式在线生成器】https://cron.qqe2.com/ 二、案例: EnableScheduling //开启任务调度package com.sky.task;import com.sky.entity.Orders; import com.sky.mapper.OrderMapper; …

LeetCode-160. 相交链表

这是一道真的非常巧妙的题,题解思路如下: 如果让他们尾端队齐,那么从后面遍历就会很快找到第一个相交的点。但是逆序很麻烦。 于是有一个巧妙的思路诞生了,如果让短的先走完自己的再走长的,长的走完走短的,…

MyBatisx代码生成

MyBatisx代码生成 1.创建数据库表 CREATE TABLE sys_good (good_id int(11) NOT NULL,good_name varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,good_desc varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (good_id) ) ENGINEInnoDB DEFAULT CHA…

Multisim软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Multisim软件是一款电路仿真和设计软件,由美国国家仪器公司(National Instruments)开发。它提供了一个交互式的图形界面,使用户能够轻松地构建和仿真电路。以下是Multisim软件的详…

nowcoder NC236题 最大差值

目录 题目描述: 示例1 示例2 题干解析: 暴力求解: 代码展示: 优化: 代码展示: 题目跳转https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId128&tqId33768&ru/exa…

Typora mac版本安装

提示:文章介绍,Typora在Mac系统中免费安装使用 文章目录 一、官网下载二、安装 一、官网下载 官网地址:https://www.typoraio.cn/ 二、安装 安装好后按 command 空格键,找到 Typora的安装路径 /Applications/Typora.app/Con…

Kubernetes(七)修改 pod 网络(flannel 插件)

一、 提示 需要重启服务器 操作之前备份 k8s 中所有资源的 yaml 文件 如下是备份脚本,仅供参考 # 创建备份目录 test -d $3 || mkdir $3 # $1 命名空间 # $2 资源名称: sts deploy configMap svc 等 # $3 资源备份存放的目录名称for app in kubec…

oauth2.0第2季 分布式认证与授权实现单点登录

一 oauth介绍 1.0 疑问汇总 1.使用jwttoken进行令牌传输,资源服务器在本地怎么验证token? 1.1 oauth的基础内容 1.1.1 oauth是什么 1.1.2 oauth的角色 1.1.3 oauth的认证流程 1.1.4 oauth的4种模式 1.2 为何要用oauth2.0 1.介绍单体架构 使用ses…

k8s节点pod驱逐、污点标记

一、设置污点,禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后,可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…

Android需要掌握的shell脚本基础

linux中sh是链接到bash上的,所以sh与bash在功能上是没有区别的,相当于bash解析器是sh的增强版本,所以安卓开发者可以在 git bash中 测试脚本 1,shell脚本运行与输出指令 $ cat test.sh echo 测试 【输出】$ /bin/bash test.…

LeetCode第26~30题解

CONTENTS LeetCode 26. 删除有序数组中的重复项(简单)LeetCode 27. 移除元素(简单)LeetCode 28. 找出字符串中第一个匹配项的下标(简单)LeetCode 29. 两数相除(中等)LeetCode 30. 串…

qt设计界面

widget.h #ifndef WIDGET_H #define WIDGET_H //防止文件重复包含#include <QWidget> //QWidget类所在的头文件&#xff0c;父类头文件 #include<QIcon> #include<QPushButton> …

VS的调试技巧

Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/ 目录 1、什么是调试&#xff1f; 2、debug和release 3、调试 3.1、环境 3.2、 快捷键 3.2.1、F10和F11 3.2.2、ctrlF5 3.2.3、F5与F9 3.2.3.1、条件断点 3.3、监视和内存观察 3.3.1、监视 3.3.2、内存 …

[集创赛海云捷讯杯]全国二等奖经验分享

[集创赛海云捷讯杯]全国二等奖经验分享 一.前言二.我们的作品三.小结 一.前言 笔者是研一在校生&#xff0c;从五月份开始和本科生一起卷集创赛&#xff0c;经历初赛&#xff0c;分赛区决赛&#xff0c;全国总决赛&#xff0c;认识了很多一起做比赛的朋友收获颇丰。今年海云杯…