1.空类对象占内存大小
遵循字节对齐的原则
空类占的内存大小:1字节;目的:就是为了让你能够用它的成员函数!
class Demo
{
};
int main()
{
cout << sizeof(Demo) << endl;
return 0;
}
空类中有默认的6个成员函数:默认构造函数、析构函数、拷贝构造函数、=赋值运算符、&运算符、&运算符 const
只有当实际使用这些函数的时候,编译器才会去定义它们。
2.Explicit
作用:防止构造函数单参数时进行类型转换
class Deom
{
public:
explicit Demo(int _a =10 )
{
cout << "Demo(int)"<< endl;
this->a = _a;
};
int main()
{
cout << sizeof(Demo) << endl;
Demo demo_tmp = 10; //报错:不存在从“int”转换到“Demo”的适当构造函数
}
}
构造函数的分类:默认构造函数、拷贝构造函数、转换构造函数、普通构造函数(参数在2个或者2个以上的)
3.Final关键字
作用:就是用来修饰类以及类的成员函数的
特点:<1>final修饰类,这个类不能被继承
class Demo final
{
public:
explicit Demo(int _a = 10)
{
cout << "Demo(int)" << endl;
this->a = _a;
}
private:
int a;
};
class DemoA:Demo //报错:不能将final类类型用作基类
{
public:
explicit Demo
{
}
}
<2>final修饰虚函数的时候,虚函数是不可以被重写的!
virtual void show() final
{
cout << this->a <<endl;
}
private:
int a;
};
class DemoA:Demo
{
public:
//类型转换构造函数
DemoA(int _a = 10, int _b = 10):Demo(a)
{
cout << "Demo(int)" <<endl;
this->b = _a;
}
void show() //子类中如何调用从父类继承来的同名函数
//无法重写“final函数”Demo:show(已声明所在行数)
{
DemoA
}
}
4.Inline关键字
作用:用来修饰函数,类的成员函数用inline,变成了内联函数!
内联函数的设计的规则:
代码量少---3~5行
逻辑简单:while、for等语句
频繁使用的
为什么要设计内联函数?
调用函数要进行出入栈,出入栈就需要时间,也会占内存的开销。
如何发挥作用的:
调用函数的地方,把函数体在调用的地方直接展开去执行!
注意: 不是说你把函数写成内联函数,编译器就会按内联去处理;编译器会自己进行评估;
其实内联函数的设计是对编译器的建议!
宏函数: #define MIN(x,y) ((x)<(y) ? (x):(y))
本质是宏,只不过可以实现和函数一样的效果!在编译阶段就会进行文本的替换!要注意每一部分都要用括号括起来!形参类型按文本类型处理的!
面试题目:内联函数与宏函数的区别?
宏函数:是宏 文本替换 参数都按文本类型处理 不进行类型检查
内联函数:是函数 替换 形参是有确定类型的,在使用的时候需要什么类型就要给什么类型的数据! 会进行类型检查
其实内联函数就是对宏函数的优化!
5.类型转换函数
C中的类型转换方式:
<1>隐式类型转换
<2>强制类型转换 (类型)表达式 类型(表达式)
C++中的类型转换函数---函数模板
const强转成非const;类似于我们c中的强制类型转换 父与子之间的转换
代码:
int main()
{
struct T
{
int i;
};
const T a; //a是不可以改变的
//a.i = 10;
T&b = const cast<T&>(a); //const_cast<T&>函数模板
b.i=10;
cout << a.i <<endl;
}
6.异常处理
什么是异常:
编码过程中遇到的报错!
编码过程中遇到的错误:
编译错误(语法错误)
运行时错误(逻辑错误):数组越界、野指针、打开文件失败、动态开空间、打开数据库等等!
避免逻辑错误:
用返回值来做判断!
C++中引入了专门处理异常的机制:
Try{可能会出现异常的代码}
Catch(异常类型){捕获异常} catch(){}
throw 来抛出异常的!
除法: 分母不能0
特性:
抛出各种类型的异常,自定义的也有系统提供的类型
跨级处理异常
三个关键字:try、throw、catch
7.智能指针--模板
问题: 解决new出来忘记做delete的释放造成内存泄漏的问题!
{
int *p = new int;
//p保存堆区的地址,p的声明周期在{}结束的时候就被系统回收,此时p指向的堆区的空间没有被释放,就会有内存泄露问题
}
解决:C++中提供了智能指针
智能指针有3种
共享智能指针 shared_ptr
独享智能指针 unique_ptr
弱型智能指针 week_ptr
画图分析:
8.单例模式--数据库
单例:单个实例 一个类只能实例化一个对象!
思考:怎么保证一个类只能创建一个对象呢?也就是说唯一的对象由谁去创建?
创建对象的目的:使用,外部要获取到唯一的对象
单例设计的三大特性:
唯一的对象由这个类它自己去创建;构造函数私有化
提供静态的成员函数去获取到唯一的对象
静态的数据成员来保存唯一的对象
单例模式又分为两种:
懒汉模式:
需要的时候才去准备的;
问题:多线程使用的时候,有可能都会去创建对象!
饿汉模式:
一开始就准备好了,以防万一!存在的问题:万一没有用到了的话,也开辟了空间!
应用场景:
任务管理器
数据库在一个项目中只要打开一次就可以了等!
代码来实现下单例—数据库的操
Day1
QT介绍
1-1、什么是QT以及优势
QT的应用:
WPS、咪咕音乐、塞班系统、飞车等
嵌入式产品:
车载系统—行车记录仪、KTV点歌系统、音乐播放器、智能手环、美图秀秀等等!
1-2、学什么:
学习API的应用:250个以上的类的使用
1-3、怎么学:
案例驱动
1-4、学习思路流程:
分析实现的功能需要什么工具:
步骤是什么样:中文的思路写出来
根据步骤一步一步的去找合适的类,查看类中的成员函数,选择合适的方法
使用:创建对象、调用函数即可
资料的查找的能力
Qt第一个工程的创建+工程里面文件的介绍
2-1、Qt工程的创建:
QWidget是一个空白的窗口。
2-1、QT工程中文件的说明:
QWidget
QApplication
qt中的三大护法:
QApplication: 控制程序的执行流程
QWidget: 界面类的父类—绘制界面的
QLayout: 布局管理:用来管理界面中所有的组件的摆放位置的
分为:绝对局部、相对布局
4、打印追踪
QDebug qDebug() <<需要输出的内容;
可以帮我们定位问题!!!
Qt的核心机制:信号和槽
作用:实现对象与对象之间的通信
5-1、案例实现: hello world
需求:当点击一个按钮的时候,在文本框中显示hello world
分析:按钮、文本框
找: QPushButton、QLabel、QLineEdit、QTextEdit
用: 创建对象
如何知道按钮被点击了呢?Qt核心机制:信号和槽
信号:
在类里面有专门的信号的声明区:signals
按钮被点击,就会产生信号; void clicked(bool checked = false);
信号被捕获到,就可以执行对应的业务处理—设置文本框的内容为hello world
槽函数:执行按钮对应的业务处理
在类里面有专门的槽函数的声明区:public slots:
如何把信号和槽关联起来:
connect(信号的发送者,信号,信号的接受者, 槽函数);
信号与槽一定要做关联
使用UI的方式绘制界面步骤:
拖拽控件,组成界面
修改每一个对象的名字
运行,查看界面是否ok
按钮转到槽函数:思考槽函数里面做什么事情
把步骤写出来
总结一下用到的类:
QPushButton setText setParent、move、resize、 setGeometry
clicked
QTextEdit setText setGeometry、clear
QTextBrowser setText clear
实际生活中的例子:红绿灯以及红绿灯下的人
5-2、计算器的实现
总结用到的类:
QLineEdit text()、clear()
QPushButton clicked()信号
QComboBox setGeometry() addItems()、currentText()、
QStringList <<
QString toDouble()—QString转成double
number()—静态的成员函数:把数值类型转成QString类型
QMessageBox 静态的成员函数 warning()
QApplication exec()
QDebug qDebug() <<
练习:
1、完成简易版的计算器: +、-、/、*, 录一个小视频发群里
2、绘制一个登录界面: 可以输入用户名,密码也可以输入—密码是密文!
全部都要录视频发班级群
作业:
整理笔记,除了知识点之外,在思维导图中把今天用到的所有的类都列出来,以及每一个类中用到的成员函数写出来,以及它的作用都标出来!
截图发班级群
完成注册、登录功能的实现!--提供工程
课堂上的案例:都去敲,一种用UI一种使用纯代码去实现!