![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
oxksn
这个作者很懒,什么都没留下…
展开
-
黑马QT210526
210526一,自定义控件封装1,添加新文件 - Qt - 设计师界面类 (.h, .cpp, .ui)2,.ui中设计QSpinBox和QSlider两个控件3,Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升4,实现功能,改变数字,滑动条跟着移动,信号槽监听5,提供getNum和setNum对外接口6,测试接口二,Qt中的事件1,鼠标事件2,鼠标进入事件 enterEvent3,鼠标离开事件 leaveEvent4,鼠标按下 mousePress原创 2021-05-26 20:45:32 · 110 阅读 · 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 · 131 阅读 · 2 评论 -
黑马QT210524
创建第一个QT程序一,QT简介(一)跨平台图形界面引擎(二)历史1,1991年奇趣科技(三)优点1,跨平台2,接口简单,容易上手3,一定程度上简化了内存回收(四)版本1,商业版2,开源版(五)成功案例1,Linux桌面环境KDE2,谷歌地图3,VLC多媒体播放器4,…二,创建一个QT程序(一)点击创建项目后,选择项目路径以及给项目起名称(二)名称 — 不能有中文,不能有空格(三)路径 — 不能有中文路径(四)默认创建有窗口类,myWidget,基类有三种选择:QWi原创 2021-05-24 21:54:02 · 87 阅读 · 0 评论 -
唐佐林C++210522
类型转换函数210522一,原创 2021-05-24 14:55:32 · 71 阅读 · 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 · 69 阅读 · 0 评论 -
唐佐林C++210522
逗号操作符的分析210522一,逗号操作符(,)可以构成逗号表达式(一)逗号表达式用于将多个子表达式连接为一个表达式(二)逗号表达式的值为最后一个子表达式的值(三)逗号表达式中的前N-1个子表达式可以没有返回值(四)逗号表达式按照从左向右的顺序计算每个子表达式的值二,重载逗号操作符(一)在C++中重载逗号操作符是合法的(二)使用全局函数对逗号操作符进行重载(三)重载函数的参数必须有一个是类类型(四)重载函数的返回值类型必须是引用Class& operator , (const原创 2021-05-22 15:21:26 · 75 阅读 · 0 评论 -
唐佐林C++210522
逻辑操作符的陷阱一,逻辑运算符的原生语义(一)操作数只有两种值(true和false)(二)逻辑表达式不用完全计算就能确定最终值(三)最终结果只能是true或者false二,本质分析(一)C++通过函数调用扩展操作符的功能(二)进入函数体前必须完成所有参数的计算(三)函数参数的计算次序是不定的(四)短路法则完全失效三,一些有用的建议(一)实际工程开发中避免重载逻辑操作符(二)通过重载比较操作符代替逻辑操作符重载(三)直接使用成员函数代替逻辑操作符重载(四)使用全局函数对逻辑操作符原创 2021-05-22 14:34:11 · 62 阅读 · 0 评论 -
唐佐林C++210521
智能指针分析一,永恒的话题(一)内存泄漏(臭名昭著的Bug)1,动态申请堆空间,用完后不归还2,C++语言中没有垃圾回收的机制3,指针无法控制所指堆空间的生命周期(二)解决方案1,重载指针特征操作符(->和*)2,只能通过类的成员函数重载3,重载函数不能使用参数4,只能定义一个重载函数...原创 2021-05-21 22:44:11 · 55 阅读 · 0 评论 -
唐佐林C++210521
经典问题解析三一,关于赋值的疑问(一)编译器为没个类默认重载了赋值操作符(二)默认的赋值操作符仅完成浅拷贝(三)当需要进行深拷贝时必须重载赋值操作符(四)赋值操作符与拷贝函数有相同的存在意义二,一般性原则重载复制操作符,必然需要实现深拷贝!!!三,编译器默认提供的函数class Test{};等价于class Test{public: Test(); Test(const Test&); Test& operator = (const Test&原创 2021-05-21 14:46:51 · 127 阅读 · 1 评论 -
唐佐林C++210521
函数对象分析一,存在的问题(一)函数一旦开始调用就无法重来1,静态局部变量处于函数内部,外界无法改变2,函数为全局函数,是唯一的,无法多次独立使用3,无法指定某个具体的数列项作为初始值二,解决方案(一)函数对象1,使用具体的类对象取代函数2,该类的对象具备函数调用的行为3,构造函数指定具体数列项的起始位置4,多个对象相互独立的求解数列项三,函数对象(一)函数调用操作符(())1,只能通过类的成员函数重载2,可以定义不同参数的多个重载函数四,小结(一)函数调用操作符(())是原创 2021-05-21 11:26:39 · 72 阅读 · 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 · 64 阅读 · 0 评论 -
唐佐林C++210520
C++中的字符串类一,历史遗留问题(一)C语言不支持真正意义上的字符串(二)C语言用字符数组和一组函数实现字符串操作(三)C语言不支持自定义类型,因此无法获得字符串类型二,解决方案(一)从C到C++的进化过程引入了自定义类型(二)在C++中可以通过类完成字符串类型的定义三,标准库中的字符串类(一)C++语言直接支持C语言的所有概念(二)C++语言中没有原生的字符串类型——---------------------------------------------——(三)C++标准库提原创 2021-05-21 09:28:45 · 74 阅读 · 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 · 52 阅读 · 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 · 73 阅读 · 0 评论 -
唐佐林C++
类中的函数重载一,函数重载回顾(一)函数重载的本质为相互独立的不同函数(二)C++中通过函数名和函数参数确定函数调用(三)无法直接通过函数名得到重载函数的入口地址(四)函数重载必然发生在同一个作用域中二,类中的重载(一)构造函数的重载(二)普通成员函数的重载(三)静态成员函数的重载三,本质(一)重载函数的本质为多个不同的函数(二)函数名和参数列表是唯一的标识(三)函数重载必须发生在同一个作用域中四,重载的意义(一)通过函数名对函数功能进行提示(二)通过参数列表对函数用法进行提原创 2021-05-20 15:42:42 · 164 阅读 · 0 评论 -
唐佐林C++210520
友元的尴尬能力一,友元的概念(一)什么是友元1,友元是C++中的一种关系2,友元关系发生在函数与类之间或者类与类之间3,友元关系是单项的,不能传递二,友元的用法(一)在类中以friend关键字声明友元(二)类的友元可以是其他类或者具体函数(三)友元不是类的一部分(四)友元不受类中访问级别的限制(五)友元可以直接访问具体类的所有成员三,友元的语法(一)在类中用friend关键字对函数或类进行声明class Point{ double x; double y; friend原创 2021-05-20 15:05:36 · 100 阅读 · 0 评论 -
唐佐林C++210520
二阶构造模式一,关于构造函数(一)类的构造函数用于对象的初始化(二)构造函数与类同名并且没有返回值(三)构造函数在对象定义时自动被调用(四)关于构造函数该知道的真相1,只提供自动初始化成员变量的机会2,不能保证初始化逻辑一定成功3,执行return语句后构造函数立即结束4,构造函数能决定的只是对象的初始态,而不是对象的诞生!!二,半成品对象(一)半成品对象的概念1,初始化操作不能按照预期完成而得到的对象2,半成品对象是合法的C++对象,也是Bug的重要来源三,二阶构造(一)工程原创 2021-05-20 14:21:59 · 101 阅读 · 0 评论 -
唐佐林C++210520
类的静态成员函数一,使用静态成员变量未完成的需求(一)统计在程序运行期间某个类的对象数目(二)保证程序的安全性(不能使用全局变量)(三)随时可以获取当前对象的数目(Failure)二,在C++中可以定义静态成员函数(一)静态成员函数是类中特殊的成员函数(二)静态成员函数属于整个类所有(三)可以通过类名直接访问公有静态成员函数(四)可以通过对象名访问公有静态成员函数三,静态成员函数vs普通成员函数静态成员函数 | 普通成员函数所有对象共享 yes原创 2021-05-20 11:25:11 · 46 阅读 · 0 评论 -
唐佐林C++210520
类的静态成员变量一,成员变量的回顾(一)通过对象名能够访问public成员变量(二)每个对象的成员变量都是专属的(三)成员变量不能在对象之间共享二,静态成员变量(一)静态成员变量属于整个类所有(二)静态成员变量的生命期不依赖于任何对象(三)可以通过类名直接访问公有静态成员变量(四)所有对象共享类的静态成员变量(五)可以通过对象名访问公有静态成员变量三,静态成员变量的特性(一)在定义时直接通过static关键字修饰(二)静态成员变量需要在类外单独分配空间(三)静态成员变量在程序内部原创 2021-05-20 10:30:54 · 40 阅读 · 0 评论 -
唐佐林C++210519
经典问题解析二一,关于析构的疑问(一)单个对象创建时构造函数的调用顺序1,调用父类的构造过程2,调用成员变量的构造函数(调用顺序与声明顺序相同)3,调用类自身的构造函数4,析构函数与对应构造函数的调用顺序相反(二)多个对象析构时1,析构顺序与构造顺序相反二,关于析构的答案1,对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象被最先析构!!2,堆对象的析构发生在使用delete的时候,与delete的使用顺序相关!!三,关于const对象的疑问(一)1,const关键字能原创 2021-05-19 22:15:06 · 60 阅读 · 0 评论 -
唐佐林C++210519
神秘的临时对象一,临时对象(一)直接调用构造函数将产生一个临时对象(二)临时对象的生命周期只有一条语句的时间(三)临时对象的作用域只在一条语句中(四)临时对象是C++中值得警惕的灰色地带二,编译器的行为(一)现代C++编译器在不影响最终执行结果的前提下,会尽力减少临时对象的产生!!!三,小结(一)直接调用构造函数将产生一个临时对象(二)临时对象是性能的瓶颈,也是bug的来源之一(三)现代C++编译器会尽力避开临时对象(四)实际工程开发中需要人为的避开临时对象...原创 2021-05-19 21:07:00 · 40 阅读 · 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 · 39 阅读 · 0 评论 -
唐佐林C++210519
对象的构造顺序一,对于局部对象(一)当程序执行流到达对象的定义语句时进行构造对象定义->构造二,对于堆对象(一)当程序执行流到达new语句时创建对象(二)使用new创建对象将自动触发构造函数的调用三,对于全局对象(一)对象的构造顺序是不确定的(二)不同的编译器使用不同的规则确定构造顺序四,小结(一)局部对象的构造顺序依赖于程序的执行流(二)堆对象的构造顺序依赖于new的使用顺序(三)全局对象的构造顺序是不确定的...原创 2021-05-19 17:22:42 · 39 阅读 · 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 · 64 阅读 · 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 · 83 阅读 · 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 · 81 阅读 · 0 评论 -
唐佐林C++210518
类和封装的概念210518一,类通常分为以下两个部分(一)类的实现细节(二)类的使用方式(三)当使用类时,不需要关心其实现细节;当创建类时,才需要考虑其内部实现细节二,封装的基本概念(一)根据经验:并不是类的每一个属性都是对外公开的1,如:女孩子不希望外人知道自己的体重和年龄2,如:男孩子不希望别人知道自己的身高和收入(二)而一些类的属性是对外公开的1,如:人的姓名,学历,国籍,等(三)必须在类的表示法中定义属性和行为的公开级别1,类似文件系统中文件的权限三,C++中类的封装(原创 2021-05-18 21:38:27 · 95 阅读 · 0 评论 -
唐佐林C++210518
进阶面向对象(下)210518一,类之间的基本关系(一)继承1,从已存在类细分出来的类和原类之间具有继承关系(is-a)2,继承的类(子类)拥有原类(父类)的所有属性和行为(二)组合1,一些类的存在必须依赖于其他的类,这种关系叫组合2,组合的类在某一个局部上由其他的类组成二,小结(一)类之间可以存在继承关系或组合关系(二)继承关系中子类拥有父类的一切属性和行为(三)组合关系是类之间整体和部分的关系(四)类及类之间的关系可以由不同的表示法(五)编译器对类的表示法有具体的要求...原创 2021-05-18 20:43:05 · 55 阅读 · 0 评论