文章目录
一、c++基础
1. c++特点
- C++兼容C语言,在C语言(面向过程)基础上引入了面对对象的机制,提高了代码的易用性、扩充性、复用性、维护性及运行效率
- 增加了模板的概念,进一步提高了代码的复用性
- c++是不断发展的语言,如c++11新特性引入了const常量、引用、右值引用、四类cast转换、try_catch函数、智能指针、auto变量、lambda函数等特性,使得代码更加安全、简洁、复用性高等
- C++面向对象三大特性(1)封装。(2)继承。(3)多态;(延展到c++三大特性)
1.1 include头文件的顺序以及双引号""和尖括号<>的区别
- 区别:
ⅰ. 尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件。
ⅱ. 编译器预处理阶段查找头文件的路径不一样 - 查找路径:
ⅰ. 使用尖括号<>的头文件的查找路径:编译器设置的头文件路径–>系统变量。
ⅱ. 使用双引号""的头文件的查找路径:当前头文件目录–>编译器设置的头文件路径–>系统变量。
2 封装、继承、多态
封装 | 继承 | 多态 |
---|---|---|
3. c++与其他面向对象语言的区别(python,java)
4. c++内存管理
4.1 内存分区
4.2 内存对齐
4.3 局部变量、全局变量、静态全局和局部变量的作用域及生命周期
4.4 new/delete及与malloc/free
5. 指针和引用
5.1 函数指针
6. 深拷贝、浅拷贝
6.1 值传递、引用传递、指针传递
7. 左值和右值
7.1 左值引用、右值引用
8. class和struct
8.1 c++中两者区别
struct | class |
---|---|
一般用于数据集合 | 一般用于封装对象 |
默认访问和继承权限为public | 默认访问和继承权限为private |
不可用于定义模板 | 可用于定于模板 |
8.2 c和c++中的struct的区别
c | c++ |
---|---|
不允许有成员函数存在 | 可以有成员函数 |
c中的访问权限只有public | c++中访问权限可设置成public、protected、private |
不允许从其他结构体那继承属性和方法 | 允许继承 |
c中使用结构体必须带上struct,或者用typedef取别名才可省略该关键字 | c++可省略struct关键字直接使用 |
9. 拷贝构造、移动构造
10. 运算符与逻辑运算符的执行顺序
11. C++从代码到可执行二进制文件的过程
ⅰ. 预编译:这个过程主要的处理操作如下:
1. 将所有的#define删除,并且展开所有的宏定义
2. 处理所有的条件预编译指令,如#if、#ifdef
3. 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
4. 过滤所有的注释
5. 添加行号和文件名标识。
ⅱ. 编译:这个过程主要的处理操作如下:
1. 词法分析:将源代码的字符序列分割成一系列的记号。
2. 语法分析:对记号进行语法分析,产生语法树。
3. 语义分析:判断表达式是否有意义。
4. 代码优化:
5. 目标代码生成:生成汇编代码。
6. 目标代码优化:
ⅲ. 汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。
ⅳ. 链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
1. 链接分为静态链接和动态链接。
a. 静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
b. 动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。([动态库创建](https://editor.csdn.net/md/?articleId=124861119)[静态库创建](https://editor.csdn.net/md/?articleId=124853205))
二、STL容器
六大容器
三、c++语法细节
1. 关键字
1.1 static
1.2 const
来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
c++ const小结
-
修饰普通的变量,则该变量值不可修改
-
修饰指针
int *p = a; //p为指向a的地址,*p为a的值
a = &p; //解引用,得到指针指向的值
指针常量 | 常量指针 |
---|---|
const * | *const |
const int* p(常用)/int const*p | int *const p |
const修饰*p,即指针指向的内容 | const修饰p,即指针指向的地址 |
则指针常量指向的值不可变,指向(地址)可变 | 常量指针修饰的是指针,则指向(地址)不可变,指向的内容可变 |
const int * const p ,为常指针常量(指向常量的常指针),指向内容和指向均不可变
-
修饰函数的形参,
一般与引用用在一起,避免值传递的缺点以及指针传递形式复杂性 -
修饰函数返回值,
A:const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
B: const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
C: const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。
1.3 final
final 是C++11新增,他可以用来修饰类,让类无法被继承;或用来修饰类的虚函数,让虚函数在子类中不能被重写。
深入理解final
-
修饰类:
修饰的类不能被继承,类中的方法不能被重写,但能被重载,故一般abstract(抽象类关键字,抽象类必须要被重写,待补充)和final关键字不能同时修饰类 -
修饰成员变量:
该成员变量不可变,若是基本类型,初始化后值不可变,若是指针或引用,指向不可变,即指向的地址不可变,内容可变 -
修饰成员方法:
该方法不能被重写,但子类仍可使用父类中的权限内方法
1.4 final和const区别
-
final 与 const 修饰的变量取值时机不同
所谓取值时机不同,指的是 const 修饰的变量是在编译时已确定下来的值,而 final 修饰的变量是在运行时才确定下来的。 -
相同内容对象创建不同
虽然创建了两个对象list1和list2,但是内容一致且都是const对象,所以其指向的是同一对象:
final声明的变量,即使内容相同,也是重新创建新的对象:
1.5 abstract
1.6 virtual
1.3 define/typedef
1.4 decltype/auto
1.5 explicit
1.8 反射reflect(待确认)
1. 9 extern
- 在C++中,导入C函数的关键字是extern,表达形式为extern “C”,
- extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
- 编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
1.10 override/overload(重载/重写/隐藏)
1.11 volatile
volatile 是“易变的”、“不稳定”的意思。volatile是 c++ 的一个关键字,用来解决在“共享”环境下容易出现的读取错误的问题。volatile详细用法介绍
3