本博客是记录作者学习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) |
2、C++的内存分区模型
C++的内存模型是C++程序在内存中的不同数据的管理方式,可以看作是C++程序和计算机系统(包括编译器)之间的契约。
内存区域类型 | 内存特点 | 存储数据类型 | 备注事项 |
---|---|---|---|
代码区 | 操作系统自动管理 | 函数体的二进制代码 | 存放CPU执行的机器指令; 代码区是共享的,共享的目的只保存一份频繁被执行的程序; 代码区是只读的,使其只读的原因是防止其他程序修改。 |
静态存储区 | 操作系统自动管理 | 全局静态变量,局部静态变量,全局变量,以及虚函数表(一份类里面只有唯一的虚函数表) | 一般是定义在类外的数据 |
常量存储区 | 操作系统自动管理 | 全局常量,函数指针(本质就是常量指针),常量数组 | 存放常量,一般不允许修改 |
栈区(stack) | 编译器自动维护 | 局部变量、函数参数、局部常量 | 内存空间较小,复杂的递归程序容易爆栈; 定义在函数中的数据一般属于该类(局部静态变量除外) 一旦函数返回,这些数据就会自动释放。 |
堆区(heap) | 编译器不负责维护,需要程序员手动负责。 | 程序员定义的指针变量 | 内存空间较大,程序员可以使用new和malloc来申请内存 但必须在不使用的时候使用delete和free释放掉。 如果程序员没有释放掉,程序结束时由操作系统回收。 涉及的问题:“缓冲区溢出”、“内存泄露” |
三、C++的常见特殊关键字
C++98/03中有63个关键字,但是很多不经常用或者比较简单,一些特殊关键字具备特定用法,需要我们特别区分记忆,也是面试常考点。
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