命名空间
-
解决命名冲突
-
命名空间定义
1.namespace + 命名空间名称 + {}
2.嵌套定义: namespace + 名称 + {
namespace + 名称 + {}
}
3.同一个命名空间可以定义多个片段 -
命名空间内成员的使用方式
1.完整的作用域 + 成员 : std::cin
2.引进成员 : using namespace std::cin
3.展开命名空间 : using namespace std(不建议使用, 所有成员都暴露在全局域中,可能会导致成员重定义) -
命名空间可以定义别名,也支持嵌套命名空间的别名定义 : namespace 别名 = 完整的命名空间(支持嵌套)
函数重载
- 前提 : 同一个作用域下才可以形成函数重载
- 条件 : 1. 函数名不同
2.参数信息不同:顺序, 类型, 个数
缺省参数
- 半缺省
- 全缺省
编译
- 预处理 : 头文件展开, 去注释, 宏替换, 条件编译
- 编译 : 语法检查, 把源代码翻译成汇编代码
- 汇编 : 把汇编代码翻译成机器码 --> 目标文件(.o, .obj) --> 导出符号表 未解决符号表
- 链接 : 把所有机器码转换成一个可执行的程序 --> 找到所有指令的地址
引用
- 给其他变量起别名{
int a = 10;
int& b = a;
} - 实质上是const指针,将int&b = a 转化为 int* const b = &a;
- 指向在定义时就确定, 不会变, 从一而终
- 使用比较安全,没有空应用, 没有解引用异常
内联函数
- inline + 普通函数定义
- 对于简单的函数, 会在调用的地方, 把指令原地展开, 最终执行时, 没有栈帧开销
- 对于复杂函数, 即使声明成内联函数, 编译器也不会展开.(包含循环递归)
- 可以用内联函数代替宏函数
- 内联函数不支持分离定义, 声明和定义放在同一个文件域中, 一般是在头文件中直接定义内联函数(如果定义和声明不在同一个地方写, 主程序中的未解决符号表中会找不到函数实现)
一些C11语法
-
auto:编译时自动类型推导, 本身不代表任何具体类型
1.auto 变量名 = 初始化表达式 ( auto b = struct Node)
2.auto 变量1 = 表达式1, 变量2 = 表达式2, … (表达式的类型必须一致)
3.函数参数, 数组不能用auto声明 -
范围for
1.遍历确定的范围的集合
2.for(类型 当前遍历的变量值 : 需遍历的遍历集合) -
nullptr
1.类型 : nullptr_t
2 .可以进行任意指针类型的隐式类型转换
类的定义
- 定义 : struct / class 类名 + {};
- 类的访问权限 : public , private , protected
1.public : 成员在任何地方可见
2.private : 成员在类外不可见
3.protected : 成员在类外不可见
4.访问权限的作用区间 : 从当前访问权限限定符开始直到下一个限定符开始的位置 - struct 和 class 定义的类唯一的区别是 : struct定义的成员默认是public, class定义的成员默认是private, 其他没有任何区别