C++
oxksn
这个作者很懒,什么都没留下…
展开
-
黑马QT210526
210526 一,自定义控件封装 1,添加新文件 - Qt - 设计师界面类 (.h, .cpp, .ui) 2,.ui中设计QSpinBox和QSlider两个控件 3,Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升 4,实现功能,改变数字,滑动条跟着移动,信号槽监听 5,提供getNum和setNum对外接口 6,测试接口 二,Qt中的事件 1,鼠标事件 2,鼠标进入事件 enterEvent 3,鼠标离开事件 leaveEvent 4,鼠标按下 mousePress原创 2021-05-26 20:45:32 · 96 阅读 · 0 评论 -
黑马QT210525
QMainWindow 一,菜单栏最多有一个 (一)QMenuBar * bar = MenuBar(); (二)setMenuBar(bar); (三)QMenu * fileMenu = bar->addMenu("文件") 创建菜单 (四)QAction * newAction = fileMenu->addAction("创建"); 创建菜单项 (五)添加分割线 fileMenu->addSeparator(); 二,工具栏 可以有多个 (一)QToolBar *toolbar原创 2021-05-25 21:44:39 · 122 阅读 · 2 评论 -
黑马QT210524
创建第一个QT程序 一,QT简介 (一)跨平台图形界面引擎 (二)历史 1,1991年奇趣科技 (三)优点 1,跨平台 2,接口简单,容易上手 3,一定程度上简化了内存回收 (四)版本 1,商业版 2,开源版 (五)成功案例 1,Linux桌面环境KDE 2,谷歌地图 3,VLC多媒体播放器 4,… 二,创建一个QT程序 (一)点击创建项目后,选择项目路径以及给项目起名称 (二)名称 — 不能有中文,不能有空格 (三)路径 — 不能有中文路径 (四)默认创建有窗口类,myWidget,基类有三种选择:QWi原创 2021-05-24 21:54:02 · 80 阅读 · 0 评论 -
唐佐林C++210522
类型转换函数210522 一,原创 2021-05-24 14:55:32 · 67 阅读 · 0 评论 -
唐佐林C++210522
前置操作符和后置操作符210522 一,区别 (一)i++; //i的值作为返回值,i自增1 (二)++i;//i自增1,i的值作为返回值 二,意想不到的事实 (一)现代编译器产品会对代码进行优化 (二)优化使得最终的二进制程序更加高效 (三)优化后的二进制程序丢失了C/C++的原生语义 (四)不可能从编译后的二进制程序还原C/C++程序 三,++操作符重载 (一)++操作符可以被重载 1,全局函数和成员函数均可进行重载 2,重载前置++操作符不需要额外的参数 3,重载后置++操作符需要一个int类型的占位原创 2021-05-22 16:23:16 · 64 阅读 · 0 评论 -
唐佐林C++210522
逗号操作符的分析210522 一,逗号操作符(,)可以构成逗号表达式 (一)逗号表达式用于将多个子表达式连接为一个表达式 (二)逗号表达式的值为最后一个子表达式的值 (三)逗号表达式中的前N-1个子表达式可以没有返回值 (四)逗号表达式按照从左向右的顺序计算每个子表达式的值 二,重载逗号操作符 (一)在C++中重载逗号操作符是合法的 (二)使用全局函数对逗号操作符进行重载 (三)重载函数的参数必须有一个是类类型 (四)重载函数的返回值类型必须是引用 Class& operator , (const原创 2021-05-22 15:21:26 · 70 阅读 · 0 评论 -
唐佐林C++210522
逻辑操作符的陷阱 一,逻辑运算符的原生语义 (一)操作数只有两种值(true和false) (二)逻辑表达式不用完全计算就能确定最终值 (三)最终结果只能是true或者false 二,本质分析 (一)C++通过函数调用扩展操作符的功能 (二)进入函数体前必须完成所有参数的计算 (三)函数参数的计算次序是不定的 (四)短路法则完全失效 三,一些有用的建议 (一)实际工程开发中避免重载逻辑操作符 (二)通过重载比较操作符代替逻辑操作符重载 (三)直接使用成员函数代替逻辑操作符重载 (四)使用全局函数对逻辑操作符原创 2021-05-22 14:34:11 · 57 阅读 · 0 评论 -
唐佐林C++210521
智能指针分析 一,永恒的话题 (一)内存泄漏(臭名昭著的Bug) 1,动态申请堆空间,用完后不归还 2,C++语言中没有垃圾回收的机制 3,指针无法控制所指堆空间的生命周期 (二)解决方案 1,重载指针特征操作符(->和*) 2,只能通过类的成员函数重载 3,重载函数不能使用参数 4,只能定义一个重载函数 ...原创 2021-05-21 22:44:11 · 49 阅读 · 0 评论 -
唐佐林C++210521
经典问题解析三 一,关于赋值的疑问 (一)编译器为没个类默认重载了赋值操作符 (二)默认的赋值操作符仅完成浅拷贝 (三)当需要进行深拷贝时必须重载赋值操作符 (四)赋值操作符与拷贝函数有相同的存在意义 二,一般性原则 重载复制操作符,必然需要实现深拷贝!!! 三,编译器默认提供的函数 class Test { }; 等价于 class Test { public: Test(); Test(const Test&); Test& operator = (const Test&原创 2021-05-21 14:46:51 · 118 阅读 · 1 评论 -
唐佐林C++210521
函数对象分析 一,存在的问题 (一)函数一旦开始调用就无法重来 1,静态局部变量处于函数内部,外界无法改变 2,函数为全局函数,是唯一的,无法多次独立使用 3,无法指定某个具体的数列项作为初始值 二,解决方案 (一)函数对象 1,使用具体的类对象取代函数 2,该类的对象具备函数调用的行为 3,构造函数指定具体数列项的起始位置 4,多个对象相互独立的求解数列项 三,函数对象 (一)函数调用操作符(()) 1,只能通过类的成员函数重载 2,可以定义不同参数的多个重载函数 四,小结 (一)函数调用操作符(())是原创 2021-05-21 11:26:39 · 68 阅读 · 0 评论 -
唐佐林C++210521
数组操作符的重载 一,字符串类的兼容性 (一)string类最大限度的考虑了C字符串的兼容性 (二)可以按照使用C字符串的方式使用string对象 string s = "a1b2c3d4e"; int n = 0; for(int i = 0; i < s.length(); i++) { if(isdigit(s[i])) { n++; } } 二,被忽略的事实 (一)数组访问符是C/C++中的内置操作符 (二)数组访问符的原生意义是数组访问和指针运算 a[n]<–>(a原创 2021-05-21 10:24:43 · 58 阅读 · 0 评论 -
唐佐林C++210520
C++中的字符串类 一,历史遗留问题 (一)C语言不支持真正意义上的字符串 (二)C语言用字符数组和一组函数实现字符串操作 (三)C语言不支持自定义类型,因此无法获得字符串类型 二,解决方案 (一)从C到C++的进化过程引入了自定义类型 (二)在C++中可以通过类完成字符串类型的定义 三,标准库中的字符串类 (一)C++语言直接支持C语言的所有概念 (二)C++语言中没有原生的字符串类型 ——---------------------------------------------—— (三)C++标准库提原创 2021-05-21 09:28:45 · 72 阅读 · 0 评论 -
唐佐林C++210520
初探C++标准库 一,C++标准库 (一)C++标准库并不是C++语言的一部分 (二)C++标准库是由类库和函数库组成的集合 (三)C++标准库中定义的类和对象都位于std命名空间中 (四)C++标准库的头文件都不带.h后缀 (五)C++标准库涵盖了C库的功能 二,小结 (一)C++标准库是由类库和库函数组成的集合 (二)C++标准库包含经典算法和数据结构的实现 (三)C++标准库涵盖了C库的功能 (四)C++标准库位于std命名空间中 ...原创 2021-05-20 20:31:18 · 47 阅读 · 0 评论 -
唐佐林C++210520
操作符重载的概念 一,操作符重载 (一)C++中的重载能够扩展操作符的功能 (二)操作符的重载以函数的方式进行 (三)本质: 用特殊形式的函数扩展操作符的功能 二,方法 (一)通过operator关键字可以定义特殊的函数 (二)operator的本质是通过函数重载操作符 (三)语法: Type operator Sign(const Type p1, const Type p2) { Type ret; return ret; } Sign为系统中预定义的操作符,如:+,-,*,/,等 三,深度挖掘原创 2021-05-20 17:07:37 · 66 阅读 · 0 评论 -
唐佐林C++
类中的函数重载 一,函数重载回顾 (一)函数重载的本质为相互独立的不同函数 (二)C++中通过函数名和函数参数确定函数调用 (三)无法直接通过函数名得到重载函数的入口地址 (四)函数重载必然发生在同一个作用域中 二,类中的重载 (一)构造函数的重载 (二)普通成员函数的重载 (三)静态成员函数的重载 三,本质 (一)重载函数的本质为多个不同的函数 (二)函数名和参数列表是唯一的标识 (三)函数重载必须发生在同一个作用域中 四,重载的意义 (一)通过函数名对函数功能进行提示 (二)通过参数列表对函数用法进行提原创 2021-05-20 15:42:42 · 147 阅读 · 0 评论 -
唐佐林C++210520
友元的尴尬能力 一,友元的概念 (一)什么是友元 1,友元是C++中的一种关系 2,友元关系发生在函数与类之间或者类与类之间 3,友元关系是单项的,不能传递 二,友元的用法 (一)在类中以friend关键字声明友元 (二)类的友元可以是其他类或者具体函数 (三)友元不是类的一部分 (四)友元不受类中访问级别的限制 (五)友元可以直接访问具体类的所有成员 三,友元的语法 (一)在类中用friend关键字对函数或类进行声明 class Point { double x; double y; friend原创 2021-05-20 15:05:36 · 96 阅读 · 0 评论 -
唐佐林C++210520
二阶构造模式 一,关于构造函数 (一)类的构造函数用于对象的初始化 (二)构造函数与类同名并且没有返回值 (三)构造函数在对象定义时自动被调用 (四)关于构造函数该知道的真相 1,只提供自动初始化成员变量的机会 2,不能保证初始化逻辑一定成功 3,执行return语句后构造函数立即结束 4,构造函数能决定的只是对象的初始态,而不是对象的诞生!! 二,半成品对象 (一)半成品对象的概念 1,初始化操作不能按照预期完成而得到的对象 2,半成品对象是合法的C++对象,也是Bug的重要来源 三,二阶构造 (一)工程原创 2021-05-20 14:21:59 · 98 阅读 · 0 评论 -
唐佐林C++210520
类的静态成员函数 一,使用静态成员变量未完成的需求 (一)统计在程序运行期间某个类的对象数目 (二)保证程序的安全性(不能使用全局变量) (三)随时可以获取当前对象的数目(Failure) 二,在C++中可以定义静态成员函数 (一)静态成员函数是类中特殊的成员函数 (二)静态成员函数属于整个类所有 (三)可以通过类名直接访问公有静态成员函数 (四)可以通过对象名访问公有静态成员函数 三,静态成员函数vs普通成员函数 静态成员函数 | 普通成员函数 所有对象共享 yes原创 2021-05-20 11:25:11 · 43 阅读 · 0 评论 -
唐佐林C++210520
类的静态成员变量 一,成员变量的回顾 (一)通过对象名能够访问public成员变量 (二)每个对象的成员变量都是专属的 (三)成员变量不能在对象之间共享 二,静态成员变量 (一)静态成员变量属于整个类所有 (二)静态成员变量的生命期不依赖于任何对象 (三)可以通过类名直接访问公有静态成员变量 (四)所有对象共享类的静态成员变量 (五)可以通过对象名访问公有静态成员变量 三,静态成员变量的特性 (一)在定义时直接通过static关键字修饰 (二)静态成员变量需要在类外单独分配空间 (三)静态成员变量在程序内部原创 2021-05-20 10:30:54 · 37 阅读 · 0 评论 -
唐佐林C++210519
经典问题解析二 一,关于析构的疑问 (一)单个对象创建时构造函数的调用顺序 1,调用父类的构造过程 2,调用成员变量的构造函数(调用顺序与声明顺序相同) 3,调用类自身的构造函数 4,析构函数与对应构造函数的调用顺序相反 (二)多个对象析构时 1,析构顺序与构造顺序相反 二,关于析构的答案 1,对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象被最先析构!! 2,堆对象的析构发生在使用delete的时候,与delete的使用顺序相关!! 三,关于const对象的疑问 (一) 1,const关键字能原创 2021-05-19 22:15:06 · 56 阅读 · 0 评论 -
唐佐林C++210519
神秘的临时对象 一,临时对象 (一)直接调用构造函数将产生一个临时对象 (二)临时对象的生命周期只有一条语句的时间 (三)临时对象的作用域只在一条语句中 (四)临时对象是C++中值得警惕的灰色地带 二,编译器的行为 (一)现代C++编译器在不影响最终执行结果的前提下,会尽力减少临时对象的产生!!! 三,小结 (一)直接调用构造函数将产生一个临时对象 (二)临时对象是性能的瓶颈,也是bug的来源之一 (三)现代C++编译器会尽力避开临时对象 (四)实际工程开发中需要人为的避开临时对象 ...原创 2021-05-19 21:07:00 · 38 阅读 · 0 评论 -
唐佐林C++210519
对象的销毁 一,一般而言,需要销毁的对象都应该做清理 (一)解决方案 1,为每个类都提供一个public的free函数 2,对象不再需要时立即调用free函数进行清理 class Test { int *p; public: Test() { p = new ini; } void free() { delete p; }; } 二,析构函数 (一)C++的类中可以定义一个特殊的清理函数 1,这个特殊的清理函数叫做析构函数 2,析构函数的功能与构造函数相反 (二)定义:~ClassName() 1,原创 2021-05-19 20:19:24 · 34 阅读 · 0 评论 -
唐佐林C++210519
对象的构造顺序 一,对于局部对象 (一)当程序执行流到达对象的定义语句时进行构造 对象定义->构造 二,对于堆对象 (一)当程序执行流到达new语句时创建对象 (二)使用new创建对象将自动触发构造函数的调用 三,对于全局对象 (一)对象的构造顺序是不确定的 (二)不同的编译器使用不同的规则确定构造顺序 四,小结 (一)局部对象的构造顺序依赖于程序的执行流 (二)堆对象的构造顺序依赖于new的使用顺序 (三)全局对象的构造顺序是不确定的 ...原创 2021-05-19 17:22:42 · 34 阅读 · 0 评论 -
唐佐林C++210519
初始化列表的使用210519 一,C++中提供了初始化列表对成员变量进行初始化 语法规则: ClassName::ClassName():m1(v1), m2(v1, v2), m3(v3) { //some other initialize operation } 二,注意事项 (一)成员的初始化顺序与成员的声明顺序相同 (二)成员的初始化顺序与初始化列表中的位置无关 (三)初始化列表先于构造函数的函数体执行 三,类中的const成员 (一)类中的const成员会被分配空间的 (二)类中的const成原创 2021-05-19 16:04:45 · 60 阅读 · 0 评论 -
唐佐林C++210519
对象的构造210519 一,对象的初始化 (一)从程序设计的角度,对象只是变量,因此: 1,在栈上创建对象时,成员变量初始为随机值 2,在堆上创建对象时,成员变量初始为随机值 3,在静态存储区创建对象时,成员变量初始为0值 (二)一般而言,对象都需要一个确实的初始状态 1,解决方案 (1)在类中提供一个public的initialize函数 (2)对象创建后立即调用initialize函数进行初始化 (3)存在的问题 a,initialize只是一个普通函数,必须显示调用 b,如果未调用initialize原创 2021-05-19 15:18:18 · 79 阅读 · 0 评论 -
唐佐林C++210519
类的真正形态 一,类的关键字 (一)struct在C语言中已经有了自己的含义,必须继续兼容 (二)在C++中提供了新的关键字class用于类定义 (三)class和struct的用法是完全相同的 二,struct和class的区别 (一)在用struct定义类时,所有成员的默认访问级别为public (二)在用class定义类时,所有成员的默认访问级别为private 三,类的声明与实现 (一)C++中的类支持声明和实现的分离 (二)将类的实现和定义分开 1,.h头文件中只有类的声明 (1)成员变量和成员函原创 2021-05-19 09:31:21 · 74 阅读 · 0 评论 -
唐佐林C++210518
类和封装的概念210518 一,类通常分为以下两个部分 (一)类的实现细节 (二)类的使用方式 (三)当使用类时,不需要关心其实现细节; 当创建类时,才需要考虑其内部实现细节 二,封装的基本概念 (一)根据经验:并不是类的每一个属性都是对外公开的 1,如:女孩子不希望外人知道自己的体重和年龄 2,如:男孩子不希望别人知道自己的身高和收入 (二)而一些类的属性是对外公开的 1,如:人的姓名,学历,国籍,等 (三)必须在类的表示法中定义属性和行为的公开级别 1,类似文件系统中文件的权限 三,C++中类的封装 (原创 2021-05-18 21:38:27 · 90 阅读 · 0 评论 -
唐佐林C++210518
进阶面向对象(下)210518 一,类之间的基本关系 (一)继承 1,从已存在类细分出来的类和原类之间具有继承关系(is-a) 2,继承的类(子类)拥有原类(父类)的所有属性和行为 (二)组合 1,一些类的存在必须依赖于其他的类,这种关系叫组合 2,组合的类在某一个局部上由其他的类组成 二,小结 (一)类之间可以存在继承关系或组合关系 (二)继承关系中子类拥有父类的一切属性和行为 (三)组合关系是类之间整体和部分的关系 (四)类及类之间的关系可以由不同的表示法 (五)编译器对类的表示法有具体的要求 ...原创 2021-05-18 20:43:05 · 49 阅读 · 0 评论