当前位置: 首页 > news >正文

C/C++基础详解(二)

1.C++中struct与class区别

相同点:
1.都是用来定义类对象的
2.都有成员函数和成员变量,都有权限设置不同点:
1.默认权限不同,class默认是private权限,struct由于要兼容C,默认是public权限
2.继承上:class默认是私有继承,struct默认是public继承补充:
C++中struct与C中struct区别:
1.C中无权限设置,C++中存在权限设置
2.C中struct中只能放变量,不能定义函数,C++中都可以做到
3.C++中struct能继承,能实现多态,C不能

2.define与const区别

1.define在预处理阶段进行,const在编译和运行时起作用
2.define只是进行宏替换,在代码中可能存在多份代码,const修饰只在程序中有一份备份
3.define不做类型检查,const要进行类型检测
4.define是用来进行宏替换的,不进行空间开辟,而const修饰的变量是需要分配空间的

3.const与static作用

static:
1.static修饰的全局变量和函数作用域限定到当前文件,而未被修饰的全局变量和函数是可以在其他文件中访问的,外部使用需要extern声明
2.在C++中类成员变量被static修饰,定义必须在类外,定义时可以不加static,储存在全局数据区,权限不改变
3.C++类成员函数被static修饰,该函数无法直接访问类中非成员函数和对象,无需要实例化类对象即可调用,无this指针---指针常量const:
1.const修饰变量必须初始化
2.const修饰的形参可以接受非const修饰和const修饰的变量
3.const修饰类变量是不能在类外部初始化,必须在类中调用构造函数初始化
4.const修饰类函数时,该函数无法访问非const修饰的函数和变量
5.const修饰的变量和函数也将作用域限定到当前文件

4.内联函数和宏区别

1.宏不进行类型检测,内联函数要进行类型检测
2.宏书写过于麻烦,通常要判断是否加括号,内联只需要直接使用即可
3.宏在预处理阶段进行替换,内联函数在编译时将函数代码嵌入目标代码中

5.大小端:

大小端详解-CSDN博客

6.malloc/free是如何分配空间的?

malloc、free这些都是函数,而非系统调用,因此实际是需要系统调用接口来实现的
首先,malloc优先去内存池中申请空间,如果满足就返回地址,否则就去堆上申请
当申请的空间大小<128K时,利用brk系统调用,使堆从低地址向高地址上升,开辟一块满足的空间
当申请的空间大小>=128时,利用mmap系统调用,在堆栈之间找到一块满足大小的空间开辟,直接映射匿名内存页free:
<128KB时,即是利用brk系统调用分配的空间,free释放不会立即归还给操作系统,而是被放入 glibc 的内存池供后续空间申请时使用,只有当堆顶的连续空闲内存超过一定大小时,才会通过 brk 收缩堆空间
>=128KB时,即通过mmap系统调用分配的空间,free释放时会立即归还给操作系统,不会留在内存池中

7.说说C++四种强制类型转换方式及其使用场景

1.static_cast<T>()
所有可以隐式类型转换的可以使用其,适用于非多态类型转换2.reinterpret_cast<T>()
使用于不同类型的转换,例如int类型转换为指针,int* p = reinterpret_cast<int*>(a);3.const_cast<T>()
适用于消除const属性的强制类型转换4.dynamic_cast<T>()
适用于父类向子类进行转换,前提是父类必须有虚函数

8.移动构造函数

在拷贝构造中,假设a拷贝一份代码给b,b复制一份后,a就不再使用,存在时间成本消耗,那么如果直接将a的空间给b,这就是移动拷贝;
相比于构造函数,通常需要采用深拷贝,但是在移动构造中,利用指针指向a的空间即可,只需要保证原来指向该空间的指针指向nullptr,防止重复析构即可
相比于拷贝构造使用的是左值,移动构造使用的是将亡值或右值,这也说明了移动构造使用场景,当然也可以通过std::move来实现左值到将亡值的转换

9.C++中临时变量转为返回值返回时是如何处理的?

当一个临时变量作为返回值返回时,函数结束时该临时变量就会销毁,此时根据返回值来判断其存放的位置:
16 位 存放在 ax 寄存器中
32 位 存放在 eax寄存器中
64 位 edx存放高32位,eax存放低32位

10.在传递参数的过程中,引用传递和指针传递的区别?

1.指针传递本质上是值传递,传递的是目标值,通过在被调函数创建一个临时指针指向目标地址(形参)
2.引用传递传递的是实参的地址,对形参的操作都是间接改变实参情况
3.在底层上来讲,指针和引用都会放在一个符号表中,但是不同的是,指针在符号表中放的是指针变量的地址值,而引用存放点是引用对象的地址值
补充知识:
符号表创建之后就不会发生改变,因此这也是为什么指针可以改变指向的原因,在符号表中存放的是指针地址,而不是其指向的内容地址,引用无法改变指向,因为其指向的地址被符号表确定了

以上就是这次的内容,感谢你的支持!!!

http://www.lryc.cn/news/615317.html

相关文章:

  • 【51单片机4按键启动停止向上向下流水灯】2022-10-26
  • 本文章分享一个本地录音和实时传输录音给app的功能(杰理)
  • 【c++】探秘Loop机制:C++中优雅的双向数据交互模式
  • Ubuntu下安全彻底删除后端服务完整指南
  • 网络原理-初识
  • PNPM总结
  • QT第一讲- Qt初探
  • Microsoft Office Visio(流程图)学习笔记
  • 使用SymPy lambdify处理齐次矩阵的高效向量化计算
  • 动手学深度学习(pytorch版):第二章节——预备知识(1)——数据操作
  • 2025华数杯数学建模C题:可调控生物节律LED光源全解析
  • 理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
  • 自动生成视频的AI大模型高效创作指南
  • 掌握数据可视化:全局配置项详解
  • Nginx 反向代理与负载均衡架构
  • Redhat Linux 9.6 配置本地 yum 源
  • qt文件操作与qss基础
  • 2025彩虹易支付官方正版无删减完整版源码
  • B.10.01.5-电商系统的设计模式应用实战
  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • Node.js特训专栏-实战进阶:22. Docker容器化部署
  • 北京JAVA基础面试30天打卡05
  • STM32的中断系统
  • 05.【数据结构-C语言】栈(先进后出,栈的实现:进栈、出栈、获取栈顶元素,栈实现代码,括号匹配问题)
  • 【排序算法】③直接选择排序
  • 心灵笔记:思考三部曲
  • 使用 Spring Boot 集成七牛云实现图片/文件上传
  • 机器翻译:FastText算法详解与Python的完整实现
  • istio笔记03--快速上手多集群mesh
  • 支持 UMD 自定义组件与版本控制:从 Schema 到动态渲染