QObject、Qt元对象系统、对象树、属性系统
1.RTTI机制由于C++是静态类型语言,有关类的信息只在编译期被使用,编译后就不再保留,因此程序运行时无法获取类的信息。这时就需要使用「运行期类型信息」,即RTTI(Run-Time Type Information)。一般拥有程序运行时保存对象类型信息能力的语言,我们就称该语言支持RTTI。C++标准定义了dynamic_cast和typeid两个关键字用于支持RTTI机制。
dynamic_cast的作用是将指向基类对象的指针转换为指向派生类对象的指针,如果转换失败则返回NULL。因此,dynamic_cast唯一的功能就是判断一个对象具有哪些类型。例如有4个类GrandFather、Father、Son和GrandSon,右边的类分别是左边类的派生类。此时有一个类型为GrandFather *的指针p,为了判断p所指对象是否具有Son的类型,可以使用语句Son *son = dynamic_cast<Son*>(p)。如果返回的son不为NULL,则p所指的对象具有Son类型。同理我们也可以得到该对象是否具有Father、GrandSon类型,
但是仅仅知道这些是不 ...
const小结
1.constexpr与const
constexpr修饰的变量允许编译器在编译阶段对其进行验证,检验变量的值是否为常量(如果认定变量为常量表达式,可声明为constexpr)
代码Review
三个层次优化: 1.可读性 ①变量、方法命名 ②逻辑是否可被现成库替代 ③代码做到简洁、自注释 2.健壮性 ①代码的改动是否会影响到其他模块 ②参数考虑的范围是否细致 3.可扩展性 ①是否易于扩展
CICD小结
CI(Continuous Integration持续集成):持续集成发生在每次提交代码时,在局域网内某个主机搭建持续集成环境,对每次提交的代码进行构建、测试,保证了每次提交的代码的稳定性。CD(Continuous Delivery持续交付):在持续集成后,通过脚本自动搭建发布环境,生成可持续交付的可执行文件,缩短发布时间。
GitLab的CICD流水线概况:
流水线会运行自动生成的yaml文件
GitLab-runner的应用,在目标机器下载并为项目注册一个runner,配置相关信息并打开runner,提交代码时会自动触发(可手动)流水线开始运行,runner拉取远程仓库代码并进行脚本相关操作,可修改runner的相关配置信息。runner是cicd的关键。
YAML文件:
artifacts关键字用于打包需要的工件
Ruby语法:
def:用于定义方法(函数)。方法是 Ruby 程序中执行特定任务的代码块,可以在程序中多次调用。def 关键字后面通常跟随方法名,然后是方法的主体,用于定义方法的操作和行为。
权限问题:
在目标机器配置环境以及编译可能遇到的问题: ...
设计模式原则
1.单一职责原则
2.开闭原则:抽象约束,封装变化例如:矩形和圆类,需要获取它们的面积// 面积计算器class AreaCalculator{ double area(Rectangle shape) { return shape.getWidth() * shape.getHeight(); }}//此设计不利于扩展,可设计一个shape接口类实现计算面积
优化:class shape{ double getArea();}class juxing:public shape
3.里氏替换原则:关于继承
例如:企鹅、鸵鸟和几维鸟从生物学的角度来划分,它们属于鸟类;但从类的继承关系来看,由于它们不能继承“鸟”会飞的功能,所以它们不能定义成“鸟”的子类。同样,由于“气球鱼”不会游泳,所以不能定义成“鱼”的子类;“玩具炮”炸不了敌人,所以不能定义成“炮”的子类等。
对于正方形和长方形最好的做法是再添加一个父类,他们同时继承自这个父类。
对此修正方法是取消原来的继承关系,重新设计它们之间的关系
4.依赖倒置原则例如 ...
Qt信号与槽
1.传统写法SIGNAL(f(int ))SLOT(g(int ))此写法只是简单的字符串匹配,信号和槽的参数类型在字符串上必须是一致的。所以该写法不能适配typdef与namespace以及兼容类型的参数。
2.写法1的扩展
connect为qobject的函数
3.以指针形式指定
此时会有一个问题:若函数发生重载,无法指定唯一的函数解决:使用函数指针简化版:static_cast<(void)(&B::*)(int)>(&B::fun)
Qt项目的构建与编译
pro文件:包含内容为项目整体所依赖的库,项目构建方式,项目包含的头文件和源文件等。
qmake:qmake是Qt公司制造专门生成Qt专用makefile文件的项目管理工具。因为项目编译前会调用Qt专有的moc(The Meta-Object Compiler)编译器和uic(User Interface Complier)编译器对Qt源文件进行预处理,所以需要专门的工具来生成Qt风格的makefile文件。注:执行qmake会更新makefile文件
MinGW:是一套用于Windows平台的自由开源软件开发工具集合。包含GCC编译器用于编译C、C++文件,包含GNU Make工具用于自动化构建过程,还包含调试器(GDB)等。我们使用它的GNU Make工具来对makefile文件进行编译。
makefile文件:当包含多个源文件时,使用gcc命令逐个去编译会导致工作量很大,所以需要一个文件包含编译指令。这个Makefile文件包含了编译、链接等构建规则的信息,make工具根据makefile中的命令进行编译和链接,makefile命令中包含了gcc去编译某个源文件的命令。
make ...
计算机网络学习小结
TCP/IP五层网络自顶向下分别为应用层、传输层、网络层、数据链路层、物理层,也可分为四层(数据链路层与物理层合并为网络接口层)
.alefbsqnwvux{}
各层用到的协议:
应用层概念1.基本概念:每个应用层协议都是为了解决某一类应用问题,而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用进程之间的这种通信必须遵循严格的规则。应用层的具体内容就是精确定义这些通信规则。2.应用层协议需定义的内容:● 应用进程交换的报文类型,如请求报文和响应报文。● 各种报文类型的语法,如报文中的各个字段及其详细描述。● 字段的语义,即包含在字段中的信息的含义。● 进程何时、如何发送报文,以及对报文进行响应的规则。
域名系统DNS1.概念:域名系统DNS (Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。DNS是基于UDP协议的。2.为何使用域名:IP地址不便记忆且不直观3.DNS的设计:因特网的域名系统DNS被设计成为一个联机分布式数据库系统,并采用客户-服务器方式。DNS使大多数名字都在本地进 ...
编码知识小结
开始计算机由美国人发明,只需要输入简单的符号和英文字母就可以。一个字节可以表示256个符号,于是就创造了ASCII编码。ASCII编码大小1字节,第一位为0,所以有7位表示字符,也就是一共表示128个字符。
后来随着计算机的发展,欧洲、亚洲地区不同语言需要不同的字符表示,在原有的ASCII编码基础需要有扩展。各国有自己的编码标准,如中国制定了GB2312编码,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里。
这样就导致了编码标准的冲突,所以需要有统一的编码标准。于是Unicode字符集应运而生,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode字符集可用1~4字节表示一个字符,通常是两个字节。Unicode编码方案有很多,常见的Unicode编码方案包括UTF-8、UTF-16、UTF-32等。
以UTF-8为例,UTF-8是以一个字节为单位对Unicode进行编码。UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于 ...
C++多态
——————————————————————多态:一个接口,多种方法
虚表
如果存在虚函数,那么该类的大小会多一个指针的大小,该指针指向虚函数表。
编译器把虚函数指针放在最前面
虚表的每个单元存放虚函数的地址
C++的多态性
这就是c++中的多态性,当c++编译器在编译的时候,发现Father类的Say()函数是虚函数,这个时候c++就会采用晚绑定技术,也就是编译时并不确定具体调用的函数,而是在运行时,依据对象的类型来确认调用的是哪一个函数,这种能力就叫做c++的多态性,我们没有在Say()函数前加virtual关键字时,c++编译器就确定了哪个函数被调用,这叫做早期绑定。——————————————————————
1.在成员函数内可以调用纯虚函数,在构造函数/析构函数内部不能使用纯虚函数。
如果一个类从抽象类派生而来,它必须实现了基类中的所有纯虚函数,才能成为非抽象类。
2.基类的析构函数为虚函数时
3.虚函数理解:实现多态性,定义父类指针指向子类对象,调用指针时访问的是子类的重载函数。
4.字节对齐+static不影响类大小+虚指针大小为8
5.对于含有虚函数的类, ...
