- 博客(30)
- 资源 (1)
- 收藏
- 关注
原创 C++中的类模板
前边我们知道,C++中的泛型编程,有函数模板和类模板两种形式,我们之前已经对函数模板做了分析,这章我们就对类模板做个分析。将模板的思想应用于类,我们就可以只关注类的功能实现,不需要关注具体数据元素的类型,这种思想非常适用于编写数据结构相关的代码,比如数组类、线性表、栈和堆等,只需要实现他们的逻辑功能,不必关注具体的数据类型。 C++中的类模板与函数模板一样,都是使用templat...
2018-08-24 11:25:16 786 1
原创 C++中的函数模板
之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各的优缺点 宏定义: - 优点:代码复用,适合所有的类型 - 缺点:缺少类型检查,宏在预处理阶段就被替换掉,编译器并不知道宏的存在 函数: - 优点:真正的函数调用,编译器对类型进行检查 - 缺点:类型不同需要重复定义函数,代码无法复用上边两种方式...
2018-08-23 19:57:54 64542 22
原创 C++中的抽象类与接口
在面向对象编程时,有一些抽象的概念,而且可以从生活中映射过来,比方如何求一个图形的面积?这里的问题就是:没说明是求什么图形的面积,所以就求不出图形的面积,但是图形在我们生活中却是一个实实在在存在的概念,没有具体的对象实例。 同样在面向对象编程中,这个抽象的概念就对应到抽象类 - 抽象类可用于表示现实世界中的抽象概念 - 抽象类是一种只能定义类型,不...
2018-08-23 16:58:57 562
原创 C++中的对象模型分析
到目前为止,我们都是使用class关键字来定义类,其实在C++中,class是一种特殊的struct - 在内存中class依旧像struct一样,可以看作变量的集合 - class与struct遵循相同的内存对齐规则 - class中的成员函数与成员变量是分开存放的 - 每个对象拥有独立的成员变量 - 所有对象共享类中的成员函数 #i...
2018-08-23 12:24:10 482
原创 C++中的多态特性
前边我们知道,C++类之间有继承关系,子类能够哦继承父类并且拥有父类的属性,也能够定义子类自己的属性,古语就是:青出于蓝而胜于蓝。 但是子类中是否可以定义父类中的同名成员,使用时如何区分该成员是父类中的还是子类中的?下边代码来验证一下#include <iostream>using namespace std;class parent{public:...
2018-08-22 18:40:39 734
原创 C++数据结构-单链表创建
前边我们创建了顺序存储结构的线性表,简称顺序表,顺序表最大的问题是:插入和删除需要移动大量的元素。为了解决 这个问题, 我们引入链式存储结构的线性表,简称链表,链表与顺序表不同,链表的每个结点在内存中是分开存放的,每个结点都包含数据域和指针域: - 数据域 :存储数据元素本身 - 指针域 :存储相邻结点的地址链式存储结构的线性表有 - 单链表:每个结点只包含...
2018-08-22 00:20:25 8735 2
原创 C++数据结构数组类的创建
在C或C++的原生数组里,有一点不好的就是数组越界是察觉不到,代码也不会提醒,至于越界产生的bug什么时候引发系统问题,我们也无从知晓。在这里我们可以创建一个数组类,内部包含数组长度、数组越界访问时能主动发现。 数组类的创建我们还是按照顺序表的思路,创建一个Array类,实现基本的操作,再创建StaticArray与DynamicArray一个静态一个动态数组类,数组存储位置及大...
2018-08-18 20:30:23 5013
原创 C++数据结构-线性表顺序存储结构设计
线性表的顺序存储结构:指的是用一段地址连续的存储单元一次存储线性表中的数据元素,如下:有了以上概念,我们可以使用一维数组来实现线性表的顺序存储结构, 存储空间:T* m_marry 当前长度:int m_length整个类继承于之前我们写的List类,并采用泛型编程,在这里我们把顺序表分为静态顺序表与动态顺序表,静态顺序表的存储空间是直接在栈上分配的,通过类模板来定义空间长...
2018-08-13 23:40:32 1091
原创 C++数据结构线性表的本质和操作
线性表(List)定义:具有相同类型的n(n≥0)个数据元素的有限序列 (a0, a1, a2, ... , an-1),ai是数据元素,n是表长度线性表(List)具有如下性质: - a0为线性表的第一个元素,只有一个后继 - an-1 为线性表的最后一个元素,只有一个前驱 - 除了a0与an-1外的其他元素ai,既有前驱又有 后继 - 直接支持...
2018-08-12 23:29:51 355
原创 C++数据结构类族结构的进化
我们在MyLib数据结构内定义了顶层父类MyObject,数据结构中的所有子类都继承于MyObject顶层父类,前边我们定义的智能指针类SmartPointer、异常类ExcepTion都要稍作改动(这里代码不再显示,直接在对应的篇章中继承自MyObject类即可),将他们继承于MyObject类,确保MyLib 中的所有类位于单一的继承树。LMSLib数据结构库的开发方式 - 单一继承...
2018-08-12 22:41:56 518
原创 C++数据结构顶层父类的创建
至于为什么要创建一个顶层父类,在当代软件架构实践中的经验 - 尽量使用单重继承的方式进行系统设计 - 尽量保持系统中只存在单一的继承树 - 尽量使用组合关系代替继承关系但是C++编译器的差异,使得同样的代码可能表现不同的行为,例如new操作失败后,不同的编译器,可能返回NULL空指针,也了能抛出一个固定的异常。这就导致代码的移植性变差,所以我们要创建一个 顶层父...
2018-08-12 21:49:31 500
原创 C++数据结构异常类的构建
前边我们知道,C++中的异常类型有基本数据类型,除此之外,也可以是自定义类类型,对于类类型异常的匹配依旧是至上而下严格匹配,父子间的赋值兼容性原则在异常匹配中依然适用,也就是说抛出的子类异常,catch语句中可以使用父类类型接收处理。 一般的设计原则是:匹配子类异常的catch放在上部;匹配父类异常的catch放在下部try{ throw child; //抛...
2018-08-12 20:06:46 495
原创 C++中的异常
代码中的异常与错误的区别,异常是可预见的,错误是不可预见的。C++内置了异常处理语法 元素try...catch... - try 语句处理正常代码逻辑 - catch语句处理异常情况 - try 语句中的异常由对应的catch语句处理try{ double r = divide(1, 0);}catch(...){ cout <...
2018-08-12 18:26:08 266
原创 C++模板技术之智能指针示例
我们知道,软件开发中的内存泄漏是最严重的Bug之一,内存泄漏主要因为如下三点引起的: - 动态申请堆空间,用完后不归还 - C++语言中没有垃圾回收的机制 - 指针无法控制所指堆空间的生命周期 在当代的C++软件平台中的智能指针 - 指针生命周期结束时主动释放堆空间 - 一片堆空间最多只能由一个指针标...
2018-08-12 11:18:05 499
原创 泛型编程简介
在数据结构中,很大的一个特点就是只专注于数据元素之间的关系及特定结构上的算法,并不关注数据元素的具体类型。鉴于这个特点, 不考虑数据类型的泛型编程就非常适合用于数据结构。 泛型编程是不考虑具体数据类型的编程方式 例如对于交换两个数值的函数Swap,就可以考虑下边的泛型写法void Swap(T& a, T& b){ T temp; ...
2018-08-12 10:04:14 756
原创 C++继承中的构造与析构
前边的学习,我们知道了C++中的构造函数、析构函数、类之间的继承,那么当子类继承父类后,我们如何去初始化继承自父类的成员变量? C++中子类中可以定义构造函数 - 在子类的构造函数中直接通过初始化列表或者赋值的方式进行初始化 -调用父类构造函数进行初始化但是对于在子类中通过初始化列表或赋值的方式对父类进行初始化,当父类成员为private属性时,便无法直接访问...
2018-08-09 22:10:12 1126
原创 C++中类中为继承而生的访问级别:protect
到目前为止,我们知道,C++类中成员的访问级别有public与private,public公有级别能被外界直接访问,private只能被在类内部和类成员函数访问,不能被外界直接访问。但是我们又知道,子类继承父类后,便拥有了父类的所有属性,那么这个时候,子类能直接访问父类的私有成员吗? - 从面向对象的理论:子类拥有父类的所有属性,能直接访问父类的私有成员 - 从C++语法...
2018-08-09 20:56:55 13741 3
原创 C++中继承的概念和意义
在C++中,类与类之间的关系有组合与继承两种,以生活中的例子来举例,组合就好比电脑这个类由主板、CPU、内存、硬盘等这些类组成的,属于整体与部分的关系,如下图:而继承则好比电脑与苹果电脑、戴尔电脑之间的关系,也叫父子关系,电脑为父类,苹果电脑与戴尔电脑为子类,如下:先来讨论类的组合关系: - 将其他类的对象作为当前类的成员使用 - 成员对象与当前类的对象生命周期相同...
2018-08-08 22:35:35 10026 2
原创 QT实现自动关机
当今的非标设备,对于客户来说,使用越简单越方便越好,有时候客户不想通过手工去关工控机,只要PLC端关闭后,工控机也自动关闭,这在QT中很容易实现。 首先PLC与工控机上的上位机是正常连接的,只要PLC给上位机发送一个关机指令(自己协商定义),上位机中稍作处理就能自动关机,下边直接来看QT接收socket信息的槽函数clientReadData(),这里的关机指令我们假定为"SHU...
2018-08-08 15:27:56 2872
原创 QT 中Socket客户端与服务器异常断开后重连
在现在的项目开发中,经常要使用TCP/IP协议来进行通讯,但有时候与服务器端的链接由于网络问题导致连接异常或断开,这就需要我们的软件能自动重连,在Linux中,我们的思维一般是通过心跳包来监控连接是否断开,有时候还单独开一个线程,但是在QT中,就变得简单多了,当连接异常断开时,会触发相应的信号,我们只要在这个信号对应的槽函数中做重连处理就可以了,不需要另开线程也不需要心跳包。由于网上查的Q...
2018-08-08 14:43:24 9124 3
原创 QT只保留一个月内的测试数据
项目中需要保存数据,但为了节省磁盘空间,我们往往只保存一段时间内的数据,这段时间以外的数据,我们就要在软件中自动给删除掉,也有另一种方式就是监控磁盘容量,当磁盘剩余容量低到一定值后便自动删除保存的数据。但是这里我们来看看如何只保留一个月内的数据。 QT中实现这个功能还是比较简单,可以提取保存的测试文件的创建时间,也可以在保存时按日期命名,然后判断时间月份是不是跟当前月份一致,不是...
2018-08-07 22:32:24 675
原创 QT中获取磁盘可用空间
在我们写项目时,不可避免要保存数据、图片什么的,积累多了磁盘就满了,最近做的项目就是需要保存图片,其中就需要监控磁盘是否还够用,以便清空图片数据。对于获取系统磁盘,Windows系统已经提供了API来获取(如下),代码在WinBase.h中,我们在编码时需要把<windows.h>头文件包含进去GetDiskFreeSpaceExW( __in_opt LPCW...
2018-08-07 21:54:22 8116 3
原创 C++中智能指针
在C、C++中,内存泄漏引起的Bug数不胜数,主要就是申请动态内存后用完不释放,而C++又不像java那样拥有内存回收机制,在C++中,指针是无法控制所指堆空间生命周期的,所以非常容易造成堆空间申请未释放,导致内存泄漏,甚至软件奔溃。 为了解决这个问题,C++中引入了智能指针的概念 -智能指针是一种特殊的指针 -智能指针的生命周期结束时主动释放堆空间 -一...
2018-08-06 23:10:18 294
原创 C++中的函数对象
C++中除了可以对运算、数组操作符进行重载外,同时也能对函数符号“()”进重载,这个就是函数对象,重载“()”后,类对象就能像使用函数的格式一样使用, 定义一个对象className obj; 以函数的方式使用对象obj(),下边我们就来重载“()”操作符,实现斐波那契数列,并且能从任意一个位置开始计算 #include <iostream>#include &...
2018-08-06 21:42:41 470
原创 C++中操作符重载
C++中除了能进行函数重载,还能对操作符进行重载,在分析操作符重载之前,我们先来看看下边的代码: #include <iostream>#include <string>using namespace std;class Complex //定义一个复数类{private: int i; int j;public: ...
2018-08-05 10:41:16 331 1
原创 C++类中的函数重载
在前边的学习中,我们知道C++中支持函数的重载,并且知道函数重载有一下几个特性: -函数重载的本质是相互独立的不同函数 -C++中通过函数名和函数参数确定函数调用 -无法直接通过函数名得到重载函数的入口地址 -函数重载必然发生在同一个作用域中既然函数重载的要求是以上几点,那很明显,类中的成员函数也可以发生重载,而我们知道,...
2018-08-05 09:51:36 3068 2
原创 C++中构造函数之二阶构造模式
我们在前边已经知道,构造函数是C++中的一种特殊的函数,其没有返回值,在对象定义时自动被调用,主要用于对象中成员变量的初始化,但是有个问题是,我们前期一直都是默认构造函数能正常执行完毕,但是假如构造函数中执行出错,或者提前返回,会有什么情况发生?下边来看一段代码: #include <iostream>#include <string>using na...
2018-08-04 16:10:54 1890 2
原创 C++中类的(static)静态成员变量与(static)静态成员函数
在C语言中,我们知道有static静态变量,生命周期与作用域都跟普通变量有所不同。而在C++的类中,也有静态成员变量同时还有静态成员函数,先来看看C++中静态成员变量与静态成员函数的语法:#include <iostream>#include <string>using namespace std;class test{private: ...
2018-08-04 11:27:28 92790 20
原创 C++中的const对象与const成员函数
在前边几章的内容中,我们知道C++的类中可以有const成员变量,并且还知道类中的const成员变量只能在初始化列表中初始化。同样,在C++中,还存在const对象以及const成员函数,const修饰的对象为只读对象,他们的特性如下: const成员函数的定义:需要在函数的声明及定义的后边加上const关键字 -const对象只能调用const成员函数 -const...
2018-08-04 10:24:47 2837 1
原创 C++中神秘的临时对象
这一章节我们来聊一个C++中比较坑爹的地方:临时对象。先来看看下边的代码:#include <iostream>#include <string>using namespace std;class test{private: int m_value;public: test(){} test(int value) ...
2018-08-03 21:23:32 216
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人