C++基础知识汇总

文章讨论了C++中const关键字的优势、内联函数的明确类型和值传递特性、C++的多态性类型、栈与堆的区别、memcpy在用户空间和内核空间的应用、结构体内存对齐规则、左值和右值概念,以及const引用和常量指针的使用。还提到了复制构造函数的调用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与#define相比,const有什么优点

  • 首先,const能够明确指定类型。
  • 其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。
  • 第三,可以将const用于更复杂的类型,如数组和结构。

《C++ Primer Plus(第六版)》  第三章 处理数据  3.2 const限定符

与#define相比,内联函数有什么优点

  • 内联函数能够明确指定形参和返回类型。
  • 内联函数参数为值传递,不用担心修改实参。
  • 可以将内联函数用于更复杂的类型,如数组和结构。

《C++ Primer Plus(第六版)》  第八章 函数探幽  8.1 C++内联函数

C++中的两种多态性

  • C++中包含两种多态性:静态多态性和动态多态性,前者是通过函数重载实现的,后者是通过虚函数和动态联编实现的。

栈和堆的区别

  • 管理方式不同: 栈是由编译器自动申请和释放空间,堆需要程序员手动申请和释放。
  • 空间大小不同: 栈的空间是有限的,在32位平台下,VC6下默认为1M,堆最大可以到4G。
  • 能否产生碎片: 栈和数据结构中的栈原理相同,在弹出一个元素之前,上一个已经弹出了,不会产生碎片;而如果不停地调用malloc、free会造成内存碎片很多。
  • 生长方向不同: 堆生长方向是向上的,也就是向着内存地址增加的方向,栈刚好相反,想着内存减小的方向生长。
  • 分配方式不同: 堆都是动态分配的,没有静态分配的堆。动态分配由malloc函数进行。栈有静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配,栈的动态分配和堆是不同的,它的动态分配是由alloca函数进行,编译器进行释放,无需手动实现。
  • 分配效率不同: 栈的效率比堆高很多。栈是机器系统提供的数据结构,计算机在底层提供栈的支持,分配专门的寄存器来存放栈的地址,压栈出栈都有相应的指令。堆是由库函数提供的,会按照一定的算法搜索内存,因此比较慢。

https://www.bilibili.com/video/BV13V411u7Ky

linux中memcpy能从用户空间拷贝到内核空间吗

结构体内存对齐(不考虑对齐系数)

  • 第一个数据成员偏移值为0,之后每个数据成员起始位置从自身大小的整数倍开始存储。
  • 若结构体包含子结构体,其起始位置从子结构体最大元素大小的整数倍开始存储。
  • 数组从该数组元素大小的整数倍开始存储
  • 结构体最终大小必须为最大数据成员大小(子结构体以其中最大元素大小计),不足应补齐。
  • 函数、静态变量不计入结构体大小。
数据类型32位64位
(unsigned) char11
(unsigned) short22
(unsigned) int44
(unsigned) long48(区别)
(unsigned) long long88
float44
double88
pointer 指针48(区别)

什么是左值

  • 左值参数是可被引用的数据对象,例如,变量、数组、结构成员、引用和解除引用的指针都是左值。
  • 非左值包括字面常量(用引号括起的字符串除外,它们由其地址表示)和包含多项的表达式。
  • 在C语言中,左值最初指的是可出现在赋值语句左边的实体,但这是引入关键字const之前的情况。
  • 右值——不能通过地址访问的值。

《C++ Primer Plus(第六版)》  第八章 函数探幽  8.2.3 引用的属性和特别之处

尽可能将引用参数声明为常量参数

  • 使用const可以避免无意中修改数据的编程错误。
  • 使用const使函数能够处理const和非const实参,否则将只能接受非const数据。
  • 使用const引用使函数能够正确生成并使用临时变量。

《C++ Primer Plus(第六版)》  第八章 函数探幽  8.2.3 引用的属性和特别之处

常量指针与指针常量

  • 常量指针: const typeName* p; 即指向常量的指针,该指针指向的类型为常量,不能修改*p的值。
  • 指针常量: typeName* const p; 该指针为常量,不能修改p的指向。

复制构造函数被调用的三种情况

  • 定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
  • 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
  • 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值