​ 本博客是记录作者学习C++语言的常见知识。C++程序就是对象、类、方法、变量和常量等组成。

一、C++的数据类型与变量

​ 变量本质是程序可操作的存储空间的名称,每个变量都由type和value组成,其中type就是其数据类型,其决定了数据在内存中的存储方式和运算方式。

​ 常量本质是定义后不可更改value的变量。

1、C++的基本变量的数据类型

关键字 数据类型 存储大小
bool 布尔型 —(实际测试为1个字节)
void 无类型
int 整型 4 个字节
float 浮点型 4 个字节
double 双浮点型 8 个字节
char 字符型 1 个字节
wchar_t 宽字符型 2 或4 个字节

注意:每一种数据类型的内存大小与其系统位数有关,上表列出的是目前为主的64位系统,一字节为 8 位。上述的一些基本类型(char、int、double)可以使用一个或多个类型修饰符进行修饰:signed、unsigned、short和long。

2、C++的自定义变量的数据类型

     
数组    
指针   指针本质是一种特殊的变量,其在堆区(heap)为变量分配内存,每个变量存储的是另一个变量的地址。任何类型的指针存储的值都是一个16进制的数,内存大小与操作系统有关(在X86中为4个字节,在X64中为8个字节)
引用    
class  
字符串 string  
枚举 enum  
结构体 struct  
联合体 union  

二、C++的内存管理

1、C++的编译流程

  输入 工作流程 输出
编译 代码文件(.cpp) 源程序(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→目标程序(object code) 目标文件(.obj)
链接 目标文件(.obj) 与库文件(.lib,.dll)链接生成可执行文件(.exe) 可执行文件(.exe)

image-20211210005237938

2、C++的内存分区模型

​ C++的内存模型是C++程序在内存中的不同数据的管理方式,可以看作是C++程序和计算机系统(包括编译器)之间的契约。

内存区域类型 内存特点 存储数据类型 备注事项
代码区 操作系统自动管理 函数体的二进制代码 存放CPU执行的机器指令;
代码区是共享的,共享的目的只保存一份频繁被执行的程序;
代码区是只读的,使其只读的原因是防止其他程序修改。
静态存储区 操作系统自动管理 全局静态变量,局部静态变量,全局变量,以及虚函数表(一份类里面只有唯一的虚函数表) 一般是定义在类外的数据
常量存储区 操作系统自动管理 全局常量,函数指针(本质就是常量指针),常量数组 存放常量,一般不允许修改
栈区(stack) 编译器自动维护 局部变量、函数参数、局部常量 内存空间较小,复杂的递归程序容易爆栈;
定义在函数中的数据一般属于该类(局部静态变量除外)
一旦函数返回,这些数据就会自动释放。
堆区(heap) 编译器不负责维护,需要程序员手动负责。 程序员定义的指针变量 内存空间较大,程序员可以使用new和malloc来申请内存
但必须在不使用的时候使用delete和free释放掉。
如果程序员没有释放掉,程序结束时由操作系统回收。
涉及的问题:“缓冲区溢出”、“内存泄露”

三、C++的常见特殊关键字

​ C++98/03中有63个关键字,但是很多不经常用或者比较简单,一些特殊关键字具备特定用法,需要我们特别区分记忆,也是面试常考点。

image-20211209234255740

1、define和using

define的作用:define经常用来定义预处理指令,创建符号常量宏,本质只是简单的字符串替换,没有类型检查,不分配内存,是一种编程技巧。其两种用法如下:

// 定义无参数宏 PI
#define  PI 3.14159
// 定义有参数宏 MIN(a,b)
#define  MIN(a,b) (a<b ? a : b)

注意:预处理指令不是C++语句,其都由预处理器在程序正式编译之前执行,其以“#”开头,无“;”结尾。常见的预处理指令还有#include、#if、#else、#line

using的作用

2、typedef 和sizeof

typedef 的作用

sizeof的作用

inline的作用

override的作用

overload的作用

constexpr 和 const

new 和 malloc 、delete