1. C++历史
1. 为什么C的头文件要以.h结尾,而C++不用
- 因为C++的头文件是用模板编写的
2. 函数声明和 **** 函数定义的区别
- 函数声明没有函数体
- 函数声明可以有多次,函数定义只能有一次,不能重复
3. man指令
- man 1:指令
- man 2:系统调用
- man 3:库函数
4. 输出输入语句包含的知识点
- cout:输出流对象、 <<:输出流运算符、 endl:end of file 换行、 cin:输入流对象、 >>:输入流运算符
2. 命名空间
1. 为什么要使用: 为了解决命名冲突
2. 怎样使用:
- 在命名空间中可以定义变量、函数、结构体、类,将其统称为实体
- 命名空间名字::实体 ::是作用域限定符 wd::number、wd::print()
3. using的使用:
using namespace std;
// 一次引出命名空间中的所有实体,可能会出现命名冲突using std::cout;
// 一次只引出一个实体- 所有的命名空间都是可以进行扩展的:带命名空间的函数声明
- 匿名命名空间(兼容C):访问全局变量 ::number
- 命名空间可以嵌套
3. const用法
1. const修饰普通变量
- 用const修饰的变量称为常量
- 常量在定义的时候必须要进行初始化
- 常量不能赋值
- 宏定义与const常量的区别
- 宏定义发生的时机在预处理阶段,进行字符串的替换; 如果出现了错误,必须要到运行时才能发现
- const常量发生的时机在编译的时候,如果一旦发生错误,在编译的时候会进行语法检测
- 内置类型:char/short/int/float/double/long/void *
2. const修饰指针(是后面那个东西)
- 常量指针和指针常量
const int * p1;
int* const p2;
// const 修饰谁,谁不能改- 函数指针和指针函数
int (*pFunc)(int x);
int* func(x);
- 数组指针和指针数组
int (*pArray)[];
int* array[];
4. new和delete
1. 面试题:malloc/free和new/delete的异同点?
相同点:
- 都是用来申请堆空间的
- 都是需要成对出现,不能混用
不同点:
- malloc/free属于C语言库函数, 而new/delete属于C++表达式
- malloc申请的堆空间是原始的,未初始化的,但是new申请的是已初始化的2. 使用,以数组为例
int *pArray = new int[10](6);
delete [] pArray;
5. 引用
1. 什么是引用以及引用的本质
- 引用是一个变量的别名,提出来的目的就是为了减少指针的使用
- 引用的本质就是一个指针,指针常量
- 引用在定义时必须进行初始化
- 在初始化时必须绑定在一个实体上面,一经绑定就不会改变它的指向
- &前面有类型就是引用,没有就是取地址
int number = 10;
int &ref = number; // ref和number的地址相同
int number2 = 200;
ref = number; // number的值也变成了200
2. 引用作为函数的返回类型
- 不要返回局部变量的引用
- 函数的返回结果使用引用的前提:实体的生命周期一定要大于函数的声明周期
- 尽量不要使用堆空间的引用,容易发生内存泄露的问题
6. 强制类型转换
1. static_cast:普通类型之间的转换
int iNumber = 10;
float fNumber = 12.34;
num = static_cast<int>(fNumber);
2. const_cast:去掉变量的const属性
const int number = 100;
int *pInt = &number; // error
int *pInt = const_cast<int *>(&number); // 不报错,但没什么用
7. 函数重载
1. 定义
在同一作用域中,函数名相同,参数列表不同(参数个数、参数类型、参数顺序),称为函数重载(返回类型不一样不算)
2. 原理
当使用同名函数时,会根据参数类型、参数个数、参数顺序堆函数名字进行改编,称为名字改编
3. 在C++中将函数按照C的方式进行编译
#ifdef __cplusplus // 让C与C++编译器都能编译
extern "C"
{
#endif
int add(int x, int y)
{
return x + y;
}
#ifdef __cplusplus
} // end of extern "C"
#endif
8. 默认参数
给函数的参数列表设置一些默认值
int add(int x, int y = 10, int z = 0)
{
return x + y + z;
}
注意:默认参数必须要从右向左连续赋初值
9. bool类型
true/false 只占用一个字节
10. inline内联函数
inline int add(int x, int y)
{
return x + y;
}
内联函数在调用时,会使用函数体去替代函数调用
优点:省去了普通函数调用时的形参的开销,以及带参宏定义函数所不能做的参数类型检查
缺点:内联函数只能是一些小函数,函数体里不要调用其他函数,也不要写过于复杂的语句
注意:inline函数声明和实现要在同一个文件里
11. 异常安全
try
{
if (0 == y)
{
throw y; // 抛出异常
}
else
{
cout << (x / y) << x / y << endl;
}
}
catch(int e)
{
// 写异常处理逻辑
cout << "catch(int)" << endl;
}
catch(double e)
{
cout << "catch(double)" << endl;
}
catch(long e)
{
cout << "catch(long)" << endl;
}
12. C/C++字符串
1. C风格字符串
1.1 字符数组和字符指针的区别
- 字符数组:结尾有一个’\0’
- 可以改变数组中的内容
- 不可以改变数组名的指向
- 字符指针:本质是常量指针
- 不可以改变数组中的内容
- 可以改变指针的指向
2. C++风格字符串
- string类型
- 字符串大小:
str.size()
、str.length()
- 字符串拼接:
string str = s1 + s2;
- 字符串追加:
str.append(s3);
13. C/C++字符串
1. 内存分配
- 0-3G: 用户态的空间 3G-4G: 内核态的空间
- 用户态空间:栈、堆、全局变量、静态变量、程序代码区、文字常量区
2. 具体划分
- 栈区: 存放的是局部变量、函数的参数。由操作系统负责,向低地址扩展
- 堆区:malloc/calloc/new 申请的空间都是堆空间,必须由程序员手动进行释放(free/delete),向高地址扩展
- 读写段:全局变量、静态变量
- 只读段:文字常量区:字符串常量、程序代码区:存放二进制代码
所以和要不要以.h结尾有关系吗,扩展名其实并不太重要来着
刚开始学,还不太懂😂