以下是本人整理的C++基础知识点,内容并不包含全面的C++知识,只是对C++重点内容、特点进行整理和归纳。
思维导图链接:https://www.mubucm.com/doc/KSdgrTXfTS
1.1 命名空间(Namespace)
作用
申明一个命名空间,在里面定义变量、函数、类,typedef,宏等
减少命名冲突
使用
用法1:域解析操作符 ::
用法2:using 关键字声明
使用注意
推荐在函数内部声明 std,减少命名冲突的风险
1.2 新版和旧版 C++ 标准库头文件
新版产生原因
C++命名空间的引入,产生了新版 C++ 标准库
新旧版区别
旧版
.h格式结尾,官方不支持使用
iostream.h
定义的所有符号位于全局作用域
新版
不以.h结尾,在旧版基础上稍加修改而来,官方支持,更加强大和灵活
iostream
标准库定义的所有符号位于命名空间 std 中
1.3 C++输入输出和iostream
头文件iostream
包含了用于输入输出的对象:cin、cout、cerr等
cout 和 cin
都是 C++ 的内置对象,而不是关键字
由标准库的开发者提前创建好
<< 和 >> 运算符
重载过的运算符,用于对不同类型的数据进行输入输出
1.4 C++布尔类型(bool)
true 表示“真”,false 表示“假”
存储、输出 bool 变量的值,还是数字 1 和 0
1.5 C和C++中的const
const变量的存储区别
C和C++:占用内存,可使用&获取得地址
const变量的用法区别
编译阶段
C:拷贝const变量内存中的数据,将数据赋值给其它变量
C++:直接将const变量的值赋值给其它变量
值替换,更宏行为类似
执行阶段
C:const变量被修改后再对外赋值,数值发生变化
C++:const变量被修改后再对外赋值,数值不发生变化
因为赋值过程只存在于在编译过程
const变量的作用范围区别
C:作用域是当前文件,对其他文件可见,extern声明后可使用
C++:作用域是当前文件,对其他文件不可见,不能extern
1.6 new和delete运算符
new 和 malloc()的区别
同:都在堆区分配内存,必须手动释放
异: new 和 delete 管理内存,可以自动调用构造函数和析构函数
用法
new:动态分配内存
int *p = new int;
int *q = new int[10];
delete :释放内存
delete p;
delete [] q;
1.7 inline内联函数
特点
在编译时,将函数调用处用函数体代码替换
消除函数调用的时空开销,提高效率
产生多份相同的函数拷贝,增大代码体积
inline 声明只是程序员对编译器提出的一个建议,编译器会自行判断是否执行
2个作用
消除函数调用时的开销
取代带参数的宏
用法
在函数定义开头的增加 inline 关键字
inline void swap(int *a, int *b){......}
不应该在函数声明处 inline
在函数声明处添加 inline 关键字无效,会被编译器忽略
使用者没必要知道是否为内联函数
内联函数比较短小,通常会省略函数的声明
内联函数代替宏
宏
不会计算参数,直接粘贴
内联函数
先计算实参,再将结果传递给形参
普通函数和内联函数的区别
普通函数
占用虚拟地址空间
函数调用时产生入栈出栈操作
多文件编程时,函数的声明和定义应该分开
内联函数
编译后不存在,不占用虚拟地址空间
内联函数可以定义在头文件中
编译完成后内联函数就不存在了,链接时不会引发重复定义错误
多文件编程时,内联函数的声明和定义要在同一个文件中,否则分散到不同的文件中会出错
1.8 C++函数的默认参数
特点
默认参数只能放在形参列表的最后
实参和形参的传值是从左到右依次匹配的
同一个作用域(或文件)中,一个函数形参只能指定一次默认参数
函数定义和声明在同一个文件中的时候,不能同时指定默认参数
编译器使用的是当前作用域中的默认参数
同一个作用域中,一个函数可以声明多次,但形参的默认参数依然只能指定一次
作用
定义函数时,可以给形参指定一个默认值,调用函数时,可以不给形参赋值(省略赋值),直接使用默认值
减少要定义的析构函数、方法以及方法重载的数量
1.9 C++函数重载详解
介绍
函数名相同,参数列表(参数签名)不同
参数的类型、参数的个数和参数的顺序不同,参数列表不同
本质
函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样
函数重载的底层原理
编译时:对函数重命名
void Swap(int a, int b) --> _Swap_int_int() //例
函数调用时:重载决议
根据传入的实参去逐个匹配
函数重载过程的二义性和类型转换
原因
实参的类型和形参的类型不一致
类型转换:向上转换
short --> int
float--> double
1.10 实现C++和C的混合编程
修改函数在h文件的声明方式
例子myfun.h
#ifdef __cplusplus
extern "C" void display();
#else
void display();
#endif
myfun.h 被引入到 C++ 程序中:extern "C" void display();
myfun.h 被引入到 C 语言程序中:void display();
extern "C"的作用
extern "C" void fun()
告诉C++编译器,这是C函数,在.c文件中
在C++编译环境下,以C的方式编译函数fun(),这样链接阶段就能找到函数原型