- 博客(63)
- 收藏
- 关注
原创 数据结构之队列
主要完成对队列的定义和一些常量的定义。int front;// 头指针: 用来出栈int rear;// 尾指针: 用来入栈}SqQueue;
2024-09-07 15:40:52 744
原创 数据结构之栈的实现
1.栈的应用栈应该是所有数据结构应用的最为广泛的一种。应该说在所有的编程语言里面几乎都绕不开这个栈,这是为什么呢?这是因为所有的编程语言在使用函数的时候,都会用到栈。在调用函数的时候,函数的参数会依次从右往左入栈,函数在调用之后,又依次出栈。2.栈的定义栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底 (bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称 LIFO 结构。
2024-09-06 19:51:23 1179
原创 实现两(多)台windows电脑使用TCP套接字通信(亲测简单有效)
我们在学习完windows网络编程后,我想大多数人心底一直都有一个问题。网络编程就是实现多台电脑进行通信的,可我们自己在学习测试的时候,服务器端和客户端都是自己的电脑进行通信(此时ip地址为本机127.0.0),而这样的学习效果没有那么显著,没有发挥真正的网络通信的功能。那下面就跟着我的步骤:只需要准备两台电脑,服务端和客户端源代码即可实现。
2024-08-25 11:10:15 913
原创 c++项目中如何解决内存泄漏的问题
在做项目的时候,出现bug是很正常的事情,而内存泄漏则是最寻常的bug,就算是工作是十年的大佬也难免回出现这这种低级错误。如果出现这种情况,就代表出现了内存泄露,如下图所示,下面就跟着我的步骤来,一步步地分析问题,然后解决问题。
2024-08-20 16:56:28 572
原创 在windows项目中如何设计TCP网络单例模式
在项目设计中,单例设计模式是一种非常常用的软件设计模式,有很多模块都会用到它,例如TCP网络模块以及数据库模块等等,它的好处在于它确保了一个类只有一个实例,并提供了一个全局访问点(通常是静态方法)来获取这个实例。这使得在整个应用程序中都可以轻松地访问该类的唯一实例,而无需在多个组件之间传递引用。1.单例模式只有一个实例。是指整个项目全程只有而且只能创造一个实例对象。2.单例类必须自己创建自己的唯一实例。是指在类的内部通过自己来创造实例。3.单例类必须给所有其他对象提供这一实例。
2024-08-20 16:55:29 1195
原创 数据结构之线性表(单链表的实现)
定义一些功能常量和单链表的结构。这里需要注意的是,我给链表起别名的是一个指针,后面我们在实现链表功能的时候,我们传递函数参数的时候要传递的是一个双指针。这是因为链表的结构使然,因为链表存储的是其他链表的指针,它是一个地址,后面我们在进行链表的增加和删除的时候,会经常涉及到指针的变化。如果函数的参数是本身一级指针,那么在函数内部对指针的修改将不会反映到函数外部,因为函数接收到的是指针的一个副本。使用指针的指针作为参数,则可以确保在函数内部对指针的修改能够反映到原始的指针上。}Node;
2024-08-10 17:55:54 1226
原创 解释在官方文档中 “源“ 和 “目标“ 的区别
我们都知道自己学习代码其实是一件很痛苦的事情,因为在遇到陌生的api函数的时候,你就要查官方文档中的解释。到最后其实我又仔细想了下,这也不怪官方的事,因为大多数网站都是英译的,很多时候都是直接翻译成为中文的。因为我们的思维对同一个事物的解释和老外的思想不同,这也就导致了文档中的解释我们很难看懂的原因了。事情是这样的,我最经在跟视频学习一个新的项目,在学到图像处理的时候,遇到一个新的windows函数,就是复制图像内容的,例如:你有两个窗口:窗口A和窗口B,它可以将窗口A画面中的内容复制到窗口B里面。
2024-08-10 14:20:48 349
原创 Qt中对象树机制的优点以及潜在的隐患
Qt中的 QObject 会用对象树来组织管理自己,那什么是对象树?这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的childre()列表中,也就是 QList<QObject *> 变量中。注意:这个父子关系不是指类中继承的父子关系,这一点需要重点强调以下。QT里面的这个父子关系和类中的语法没有半毛钱的关系。
2024-07-29 22:19:27 835
原创 多线程网络实战之仿qq群聊的服务器和客户端
目录一、前言二、设计需求1.服务器需求 2.客户端需求三、服务端设计1.项目准备 2.初始化网络库3.SOCKET创建服务器套接字4. bind 绑定套接字 5. listen监听套接字 6. accept接受客户端连接7.建立套接字数组8. 建立多线程与客户端通信9. 处理线程函数,收消息10. 发消息给客户端 11.处理断开的客户端四、客户端设计1.项目准备2. 处理main函数参数 3.初始化网络库4.SOCKET创建客户端套接字5. 配置IP地址和端口号,连接服务器6.创建两线程,发送和接收 7.处
2024-07-07 23:21:41 1151
原创 文件读写操作之c语言、c++、windows、MFC、Qt
以上就是读写文件的所有示例写法了,虽然在语法上面都各不相同,但是在具体实现基本上都一样。都是按照三个步骤来实现,创建文件,读写文件,关闭文件,这些都不要求全部掌握,重要的理解斌且掌握这种代码思想。
2024-07-06 11:35:31 1454
原创 Windows编程之多线程事件对象(Event Object)用法详解
一、前言事件对象(Event Object)是我们在大型项目中,进行多线程同步处理的时候经常用到的一种内核对象,下面我就根据它的基础本身的特点和相关的API函数,与实战案例相结合,讲述它的基础理论和用法。
2024-07-04 11:12:12 1225
原创 将exe文件添加到注册表中,实现开机时自动运行
一、前言在Windows操作系统中,将exe文件的路径添加到注册表下,主要用于实现程序的开机自动运行功能。
2024-07-02 12:09:21 761
原创 windows网络进阶之listen参数含义
在Windows网络编程中,在使用TCP时,listen函数它是一个重要的关键的步骤,使得套接字能够接收传入的连接请求,下面我主要通过实战案例讲解listen参数的含义。注:本章是一个进阶篇,前提是能够掌握基础windows网络编程概念。二、listen参数1.SOCKET s这是一个已绑定(通过bind函数)的套接字,作用用于接收客户端的连接请求。这个参数比较好理解,我们重点讲解第二个参数。挂起的连接队列的最大长度。
2024-07-02 10:03:28 937
原创 c++函数(三)习题讲解
ave 函数传递了两个数据类型的参数,一个是 int 类型,一个是 float 类型,在进行运算的时候会发生类型转换,而 float 类型的优先级要大于 int 类型,所以返回的是 float 类型,那为什么不是引用类型呢?解析:这道题考察预处理指令,#define _H_ 定义了一个 宏,#ifdef _H_判断宏存在,之后 执行 a++ ,之后又执行 a++ ,结果 a = 102,选C。解析:这道题考查的是 当模板函数和 重载函数同时存在时,他俩的优先级的高低,更快,但同样不支持可变数量的参数。
2024-07-01 09:36:38 470
原创 c++函数(二)习题讲解
由于 a 是一个 int 类型的变量,并且 a++ 是后置递增操作符,它会返回 a 递增前的值(也就是 5),但这个值是一个右值,而不是引用或指针。解析:这道题考右值的概念,在C++中,右值是一个“临时对象”或“不持有对象身份的值”,它们可以是字面常量、临时对象或即将被销毁的对象。解析:这里decltype(auto) 作为返回类型,这意味着返回类型将由返回表达式的类型决定。解析:这里的 ++a 是一个前置递增,也就是一个左值,所以它返回的是一个引用类型,选B。是一个运算符,它返回操作数的类型。
2024-07-01 08:31:54 581
原创 c++函数(一)习题讲解
但是这道题的来意是弄明白函数的本质是什么,函数的本质就是内存,编译好后就把我们的代码翻译成为了二进制代码,这里 0x50000 就表示函数的首地址,然后通过(pAdd)类型转换为 x 函数。解析:这道题和上道题一样,只不过这次函数的形参为变为了 指针的引用,这个时候指针形参 a 就相当于 pa 的别名,a 可以改变 pa 的值,所以这道题选A。解析:这道题中,函数体的内容是交换两个变量的值,采用的是位运算的方法,但因为传递的参数是值传递,所以并不能改变实参的值,所以选A。// 此时屏幕显示2。
2024-06-30 10:09:11 639
原创 c++指针和引用之高难度(三)习题讲解
解析:这道题和上一题的区别是,指针 a 变量在括号执行完被释放,但是它指向的从堆中申请的内存空间还在,所以 指针 p 还在, p [2] = 250。解析:这道题考察的是 变量在结构体中是如何存储的,其中 a 指向结构体的地址,然后向右移动了四个字节,又指向了 mp,之后mp的值加 500,所以选C。解析:这道题大括号里的变量执行完就被释放内存了,所以ptr智能指针的值被释放掉,p[2] 的值不确定。解析:这道题比较简单,a, b 和 c 共享智能指针,a 和 c 被释放了,那就剩下 b 了,选B。
2024-06-30 08:51:09 1037
原创 c++指针和引用之高难度(二)习题讲解
p 指向了 数组 a[0] 的地址,也就是 1002 的地址,此时 *p = p[0],p[0] 等于 1002 ,p[1] 就等于 1003,选C。解析:a 分配了 4 个 int 类型的空间,a[1] = 9 , *a 就等于 a[0] 的值,此时并不确定a[0]等于多少,所以选A。解析:a的地址赋值给了b,此时 b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 4,选C。解析:这道题需要用图片解释,其中 a [0] = -1 ,也就是 0xFFFFFFFF。
2024-06-29 10:10:13 675 1
原创 c++指针和引用之高难度(一)习题讲解
解析:b指向了数组a【1】的地址,c是一个二级指针,指向的是b的地址,此时屏幕输出了0050000,说明 b 就等于 0x0050000,*c++ 就等于 c++ ,说明 c 就等于 b的地址 加 4,但是对 b 没有影响 ,此时 b 依然等于 0x0050000,选B。解析:char 占用一个字节,将 b 用类型转换指向 a的地址,此时 b 指向的就是 0x41的地址,*b++,地址会向前一位,此时指向0x42的地址,十进制为 66 ,对应ASCII表中B,所以选B。以下哪句代码将不能运行?
2024-06-29 08:59:40 638
原创 c++循环之高难度(二)习题讲解
解析:这个题和上一题的区别是 i 的初始值为 0 , 所以整个过程 中 i 每次循环过后的值都会加2,也就是 1 ,3, 5, 7.......当i的值超出int的取值范围的时候,此时while(-1++),会继续执行循环,之后 i 再加 2,while(1++)继续循环,所以为死循环,选D。解析:while(++i),i 会一直递增,循环会一直执行,但是int有取值范围,当i的值超出int的取值范围的时候,i 会等于 -1,此时 ++i 等于0,结束循环。这个时候 b 就等于 -1,结果选B。
2024-06-28 08:20:51 310
原创 c++循环(一)习题讲解
因为int有取值范围,当超过取值范围的时候就等于-1了,然后再i++等于0,跳出循环,所以结果选B。因为这是一个嵌套循环,x执行100次,y再x内部再执行100次,结果执行了10000次。是一个跳转语句,它可以跳转到程序中的某个标签位置,所以会跳出循环结果i等于5。是一个跳转语句,它可以跳转到程序中的某个标签位置,但它并不直接用于跳出循环。将在循环中不断增加,但由于没有退出条件,这个循环将永远执行下去。用于完全跳出当前的循环,所以当y == 5时,循环结束,i = 5,选A。循环,其中初始化部分将。
2024-06-28 07:11:23 1322 2
原创 c++判断(二)习题讲解
函数用于从控制台读取一个字符,它返回的是读取的字符的ASCII码值。字符 '1' 的ASCII码值是 49,所以答案选A。解析:选项A:正确。选项B:正确,a++ 后 a = 2,然后break退出循环。解析:a / 1023 得到 a = 2。所以打印1,又因为没有break,所以继续执执行打印2,选择A。解析:if()里面的是c++17 的新语法,a只在打括号内有效,所以a的值还是500,选A。表达式的值不匹配,则通常不会执行,但在这里由于。,所以会继续执行)。所以a = 3 选A。
2024-06-27 15:29:09 315
原创 c++判断(一)习题讲解
先判断a,如果不符合就不用再判断了,我们要把执行成本最低的排在最前面,可以节省大量的时间。解析:这道题if( b == 2) 和 底下的else是一起的,不要搞混了。解析:if( a = b) 就是将a 赋值给 b,然后转化为bool值,可以等效于if(b)。解析:这道题考察数据类型转换,b = a,b就是true,为1,所以a = 1,c = 6,答案选A。解析:这道题考察运算符的优先级,三元运算符的优先级要小于加法,所以这道题选C。解析:这道题考察语言逻辑,要注意买房的后面有个分号,所以选A。
2024-06-27 09:55:06 1051
原创 c++基本数据类型和计算(三)习题讲解
1.【单选题】int a=450;int main(){int a=100; { int a = 999; std::cout << a; }}A.999 B.100 C.450解析:这道题考察作用域,本身遵守就近原则,所以选A。2.【单选题】int a;{ int b = 10
2024-06-26 10:32:18 395
原创 c++基本数据类型和计算(一)习题讲解
500.0我们说过啊,带f的是float,不带f的是double,double的类型优先级要大于unsigned int类型,所以这道题选A。解析: 选项A:unsigned 类型的值 最大为 4个字节,正确。因为这个100.5首先它就编译不了,你这个必须做类型转换,如果你是用赋值的,用等于号说int a = 100.5,那可以。解析:a - b属于无符号的类型,因为unsigned的优先级大于int,所以选项C错误。解析:选项A:正确。解析:c 为 int 类型 ,所以要取整为 2,所以选A。
2024-06-25 19:37:16 583
原创 c++代码编译和运行的区别
最近在学习c++多态的时候遇到了一个问题,因为多态分为静态多态和动态多态,然后它俩的区别是静态多态在编译阶段就确定了函数地址,而动态多态在运行阶段确定函数地址。但是我对代码的编译阶段和运行阶段了解还是有些薄弱,然后查了相关的资料,于是想记录下加深下印象,同时写下自己关于编译和运行的理解。简单来说,编译就像是把你的C++代码翻译成计算机能理解的语言,而运行则是让计算机执行这些指令并得到结果。
2024-06-24 13:47:50 523
原创 c++中从父类继承的属性在子类内存中如何显示?
在C++中,继承是面向对象编程的一个重要特性,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的成员(包括数据成员和成员函数)。通过继承,派生类可以获得基类的特性,并且可以添加自己的新特性。但是从从父类继承的属性在子类内存中如何显示呢?下面通过一个案例可以直观的看到显示的位置。可见 从A类中继承的变量a,在B类中显示的内存位置要小4个字节。我创建了两个类,类A是类B的父类。
2024-06-22 13:20:28 253
原创 手写方法实现整型例如:123与字符串例如:“123“相互转化(下篇)
实现整型转化为字符串的方法有许多,有的代码量多,过程易懂;有的代码量少,却比较复杂,不管怎样能实现过程就是好的方法。!
2024-06-21 21:43:33 277
原创 手写方法实现字符串例如:“123“与整型例如:123相互转化(面试必会)
在c语言和c++中,有许许多多的数据类型相互转化的方法,这里我就不一一列举了,实在太多了。但是如果让你自己实现类型的转化的方法,你会有一个具体的思路吗?而且这也是在面试中面试官会经常问的问题,所以下面我就带着大家以字符串和整形为例,实现数据类型相互转换的方法。将字符串"123456"转化为整型123456,我们需要遍历字符串的每一项,对每一个字符元素进行单独处理,所以我们还需要定义一个第三变量index作为字符串的索引值。本章只实现了字符串到整形的转化,代码实现有很多种写法和形式,我只提供了一种写法。
2024-06-21 20:18:03 599
原创 malloc和new的本质区别
我们先来创建一个类T,代码比较简单,主要有一个静态的成员变量count。但它们之间存在一些本质的区别,主要是在使用方面,现在我们直接说结论,然后在通过一个案例来理解和加深区别。与malloc同样,我们用new关键字动态分配10个类T大小的空间,同时测试构造函数和析构函数是否发生变化。我们用malloc关键字动态分配10个类T大小的空间,同时测试构造函数和析构函数是否发生变化。得出的结果count为10,同时构造函数和析构函数都会触发。得出的结果count为0,同时构造函数和析构函数没有触发。
2024-06-18 23:38:21 479
原创 c++参考std::string自己设计类hstring
在c++中有很多的库,但是在有些时候呢,我们一定要学会自己去设计库,不要老用别人的东西,比方说这个东西方便吗?特别方便。但是这个东西呢,有很大的副作用。再比方说一些特种项目,你比方说木马病毒啊,然后外挂等等,这种工程里你如果用这样的std::string去做的话,那么它带来的后果是很恶劣的,很可怕的,在这种情况下我怎么做呢?我一般推荐大家是我自己去写一个轻量级的这种字符串类型的库,所以今天我们不学其他的知识点,主要是自己设计一个简单的库。
2024-06-18 18:10:14 937
原创 c++中main(int argc, char* argv[])参数详解
main函数第二个参数为char* argv[],char*表示字符指针,argv全称为argumen vector,翻译中文就是参数数组。从上面三行代码不难看出,char* argv[]其实存储的就是字符串数组,其中nameStr1和nameStr2表示的是指针。main函数第一个参数为int argc,int表示为整形,argc全称为。所以综上所述,main函数中第二个参数表示的就是数组,数组里面包含这命令行参数的内容。第一种不带参数很好理解,下面就来详细理解第二种带有两个参数的形式。
2024-06-13 14:02:06 2057 2
原创 c++中string用法详解
startIndex和endIndex两个索引值变量非常重要,分别代表需要获取id值和exp值的下标,每次会变化。!
2024-06-11 23:33:09 1566
原创 字符串拼接之char实现
c++中想到字符串拼接,我们都知道可以用c++库中std::string的字符串中的简单加法进行拼接。int main()但如果用字符char声明的原生字符串,应该很少人能够实现这一功能,其实很简单只需要掌握c语言中的memcpy函数就能实现这一功能。
2024-06-11 00:19:18 611
原创 c++/c中野指针和悬空指针的示例
此时,由于这块内存可能已经被操作系统重新分配给其他程序使用,或者其内容已经被改变,再次通过悬挂指针访问该内存地址可能会导致未定义的行为,比如程序崩溃、数据损坏等。释放后,这块内存可能已经被操作系统回收并重新分配给其他程序使用。此时,如果继续使用该指针访问内存,就可能导致悬空指针问题。,那么该指针就变成了悬空指针。因为该对象所占用的内存可能已经被回收或覆盖,再次通过该指针访问该对象将导致未定义的行为。,它指向的地址是未知的、不确定的、随机的。这种指针在使用时可能导致程序崩溃、数据损坏或其他不可预见的错误。
2024-06-10 18:46:08 691
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人