空类对象占内存大小
遵循字节对齐的原则
空类占的内存大小:1字节;目的:就是为了让你能够调用它的成员函数!
![](https://i-blog.csdnimg.cn/blog_migrate/f52cd8b9cb09bf4525b6a2a9bb696c38.png)
空类中有默认的6个成员函数:
默认构造函数、析构函数、拷贝构造函数、=赋值运算符、&运算符、&运算符 const
![](https://i-blog.csdnimg.cn/blog_migrate/020207fac50951f15d6d9a11c3419122.png)
Explicit
作用: 防止构造函数单参数时进行类型转换
![](https://i-blog.csdnimg.cn/blog_migrate/1aca09439496c748bbc266fdde515d24.png)
构造函数的分类:
默认构造函数、拷贝构造函数、转换构造函数、普通构造函数(参数在2个或者2个以上的)
Final关键字
作用:就是用来修饰类以及类的成员函数的
特点: <1>final修饰类,这个类不能被继承
![](https://i-blog.csdnimg.cn/blog_migrate/b97a534a3ebe7d4c47a292cb23ab99a0.png)
<2>Final修饰虚函数的时候,虚函数是不可以被重写的!
![](https://i-blog.csdnimg.cn/blog_migrate/90692d15a874cf3e5d55e296c7a11831.png)
Inline关键字
作用:用来修饰函数,类的成员函数用inline,变成了内联函数!
内联函数的设计的规则:
代码量少---3~5行
逻辑简单: while、for等语句
频繁使用的
为什么要设计内联函数?
调用函数要进行出入栈,出入栈就需要时间,也会占内存的开销。
如何发挥作用的:
调用函数的地方,把函数体在调用的地方直接展开去执行!
注意: 不是说你把函数写成内联函数,编译器就会按内联去处理;编译器会自己进行评估;
其实内联函数的设计是对编译器的建议!
宏函数: #define MIN(x,y) ((x)<(y) ?(x):(y))
本质是宏, 只不过可以实现和函数一样的效果!在编译阶段就会进行文本的替换!要注意每一部分都要用括号括起来!形参类型按文本类型处理的!
面试题目:内联函数与宏函数的区别?
宏函数:是宏 文本替换 参数都按文本类型处理 不进行类型检查
内联函数:是函数 替换 形参是有确定类型的,在使用的时候需要什么类型就要给什么类型的数据! 会进行类型检查
其实内联函数就是对宏函数的优化!
类型转换函数
C中的类型转换方式:
<1>隐式类型转换
<2>强制类型转换 (类型)表达式 类型(表达式)
C++中的类型转换函数---函数模板
![](https://i-blog.csdnimg.cn/blog_migrate/e07df650c6e3924229c8b333f91f3be4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/924ecf547010706420f19a139538dda1.png)
异常处理
什么是异常:
编码过程中遇到的报错!
编码过程中遇到的错误:
编译错误(语法错误)
运行时错误(逻辑错误):数组越界、野指针、打开文件失败、动态开空间、打开数据库等等!
避免逻辑错误:
用返回值来做判断!
C++中引入了专门处理异常的机制:
Try{可能会出现异常的代码}
Catch(异常类型){捕获异常} catch(){}
throw 来抛出异常的!
除法: 分母不能0
特性:
抛出各种类型的异常,自定义的也有系统提供的类型
跨级处理异常
三个关键字: try、throw、catch
智能指针—模板
问题: 解决new出来忘记做delete的释放造成内存泄漏的问题
![](https://i-blog.csdnimg.cn/blog_migrate/197f7b197287c969bdb6f93bfdc56564.png)
解决: C++中提供了智能指针
智能指针有 3种
共享智能指针 shared_ptr
独享智能指针 unique_ptr
弱型智能指针 week_ptr
画图分析:
![](https://i-blog.csdnimg.cn/blog_migrate/4e7154aaa35f273dbae25934492d4a86.png)
使用:
![](https://i-blog.csdnimg.cn/blog_migrate/f3a3ef467b5bc4cd9c505d8af0c6dbb9.png)
8、单例模式—数据库
单例:单个实例 一个类只能实例化一个对象!
思考: 怎么保证一个类只能创建一个对象呢?也就是说唯一的对象由谁去创建?
创建对象的目的:使用,外部要获取到唯一的对象
单例设计的三大特性:
唯一的对象由这个类它自己去创建;构造函数私有化
提供静态的成员函数去获取到唯一的对象
静态的数据成员来保存唯一的对象
单例模式又分为两种:
懒汉模式:
需要的时候才去准备的;
![](https://i-blog.csdnimg.cn/blog_migrate/979878951f8baf5dbc1fe5529ac653ca.png)
问题:多线程使用的时候,有可能都会去创建对象!
饿汉模式:
一开始就准备好了,以防万一!存在的问题:万一没有用到了的话,也开辟了空间!
![](https://i-blog.csdnimg.cn/blog_migrate/c2e6eeffe6dbadd71644019e6ad00f02.png)
应用场景:
任务管理器
数据库在一个项目中只要打开一次就可以了等!
代码来实现下单例—数据库的操作
![](https://i-blog.csdnimg.cn/blog_migrate/af5d5f6c11bfe5aba513f724643c4b9d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/060bd59a4b5638cb5815310915d5e9ce.png)