数组
- 概念
- 相同类型元素的一段连续空间
- 分类
- 一维数组、多维数组
- 初始化
- int array[]={1,2,3};
- int array[]={0};
- int array[10]={1,2,3};
- 特性
- 数组名单独出现,隐式转换为指针,指向首元素地址
- sizeof(数组名),求的是整个数组的大小
- &数组名,指向整个数组,++之后指向末尾元素下一个位置
- 用途
- TODO
函数调用过程(TODO)
- 压栈
- 从右往左(规定)
- push &b
- push &a
- call swap
- 将call swap下一条指令的地址压栈
- 执行jmp跳转
面向过程和面向对象的区别(TODO)
- 面向过程
- C语言想清楚流程,通过流程来编程
- 面向对象
- TODO
命名空间(TODO)
- 作用
- 解决命名冲突
- 定义
- namespace+命名空间名字+{}
- 多个同名的命名空间
- 命名空间的嵌套
- namespace+命名空间名字+{}
缺省参数
- 定义
- 声明或定义一个函数,参数设置一个默认值,在函数调用期间,如果没有传递实参,就采用默认值,否则采用传递的实参
- 分类
- 全缺省
- 全部参数都有默认值
- 半缺省
- 部分参数有默认值,只能从右往左依次提供,不能间隔
- 全缺省
函数重载
- 概念
- 同一作用域中,具有多个同名函数,参数列表(参数个数、参数类型、顺序)必须不同
- 与函数返回值无关
- 与变量的属性是否不同无关
- 调用原理
- 编译阶段,自动检测实参的类型,根据推演的实际结果选择调用
- 找到对应的函数,直接调用
- 没找到完全匹配的类型
- 尝试进行隐式类型转换,成功就调用
- 转换类型不成功,崩溃
- 编译阶段,自动检测实参的类型,根据推演的实际结果选择调用
- 函数名修饰规则
- C语言仅仅在函数名前加上_,比如_Add
- 将类型编译到底层使用的函数名字中,比如?+函数名+@@+YAHHH@Z
- extern C
- 按照C语言风格来编译函数
引用
- 概念
- 引用就是别名,定义中没有自己的底层空间,和引用的实体公用同一块内存空间,但是底层实现按照指针方式,其实有自己的底层空间
- 特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,就不能引用其他实体
- 使用场景
- 引用形参
- 通过形参改变外部实参,普通类型引用
- 不想通过形参改变外部实参,const类型引用
- 做返回值
- 不能返回栈上的空间
- 返回值的生命周期不受函数周期
- 引用形参
- 传值效率
- 传值或返回值,传递或返回都是实参的一份临时拷贝,所以效率低下
- 传引用,和指针效率几乎一样高
- T&—>T* const,const左值右向,表示指向不可以被修改
- const T&—>const T* const
内联函数和宏函数
- 宏函数
- 优点
- 预处理阶段,预处理器会将宏函数展开,少了函数调用过程开销,提高程序运行效率
- 缺陷
- 不是真正的函数,预处理阶段展开,因此不参与编译,安全性不高(没有参数类型检测)
- 不方便debug调试
- 每个模块都需要()
- 副作用
- #define MAX(a,b) (a)>(b)?(a):(b);
- MAX(++a,b),a会被加两次
- 代码膨胀
- 优点
- 内联函数
- 概念
- 被inline关键字修饰的函数,或成员函数放在类中定义
- 适用场景
- 代码不长
- 函数内没有循环或递归
- 优点
- 在编译阶段,编译器会将内联函数展开,少了函数调用开销,提高程序运行效率
- 是真正的函数,要参与编译,有参数类型检测,代码安全性较高
- debug模式下,编译器不会将内联函数展开(方便调试)
- 无副作用MAX(++a,b)
- 缺陷
- 代码膨胀
- 概念
宏常量—>const类型的常量:编译阶段,直接替换
类和对象
- 什么是封装?(封装的概念)
- 将事物的内部细节隐藏,必须向外提供一些公有的接口让对象之间的交互
- 火车站,购票
- 制作手机,手机使用
- 封装的实现
- 类
- 将对象的属性和操作的方法包装在一起
- 访问权限
- 通过访问权限选择性的将方法提供给外部使用
- 类
- class和struct的区别
- class的默认权限为private
- struct的默认访问权限为public
- 模板中可以用class T,不可以使用struct T
- this指针
- 类类型* const
- 特性
- TODO
- 空类的大小
- 主流编译器给的是1
- 给1个字节标识这个类
类中6个默认的成员函数(TODO)
- 构造函数
- 概念
- 一个特殊的成员函数,在创建对象时由编译器自动调用,完成对象的初始化工作
- 特性
- 函数名与类名相同,没有返回值类型
- 创建对象时由编译器自动调用,在对象的生命周期内只调用一次
- 具有初始化列表
- 初始化类中的非静态成员变量
- 成员在初始化列表只能出现一次(初始化只能初始化一次
- 与初始化列表次序无关,按照在类中的声明次序初始化
- 缺省构造函数
- 无参构造和全缺省构造,只能存在一个
- 注意
- 不能使用static和const修饰,不能是虚函数
- 作用
- 构造和初始化对象
- 单参构造函数,具有类型转化的作用,禁止使用explicit
- 调用场景
- 创建对象时由编译器自动调用,在对象的生命周期内只调用一次
- 概念
- 析构函数
- TODO
- 拷贝构造函数
- 如果没有显示定义,会默认生成,按照浅拷贝的方式
- 赋值运算符重载
- TODO
- static成员
- C语言使用方式
- static+全局变量
- 文件作用域
- static+局部变量
- 延长生命周期
- 存放在哪个位置?TODO
- static+函数
- 当前函数只能在当前文件里应用
- static+全局变量
- C++使用方式
- static+成员变量
- 类中只是声明,必须在类外初始化
- 是类的属性,不属于某个具体的对象
- 是所有类对象共享的一个成员变量
- 不会影响sizeof的结果
- 访问方式
- 通过对象访问
- 类名::访问
- static+成员函数
- 本质
- 静态成员函数,没有隐藏的this指针
- 调用
- 通过对象+.调用
- 通过类名::静态成员函数名调用
- 注意
- 静态成员函数不能访问非静态的成员变量(因为没有this指针)
- 也不能访问非静态的成员函数
- 静态成员函数不能使用const修饰
- 静态成员函数不能为虚函数(虚函数需要this找虚表才能调用)
- 本质
- static+成员变量
- C语言使用方式
- const成员
- C语言使用方式
- const只能修饰变量,代表变量不能被修改
- C++使用方式
- const+变量
- 将变量看做常量,且具有替换的作用
- 看到此变量,直接用常量替换
- const+成员变量
- 表示该成员变量不可以在成员函数内部被修改
- 必须在构造函数初始化列表位置初始化
- const+成员函数
- 修饰的成员函数中隐藏的this指针
- 代表该成员函数中不能修改类中的非静态成员变量
- 除非该成员被mutable的关键字修饰
- const+变量
- C语言使用方式