
笔记
文章平均质量分 69
云雷屯176
这个作者很懒,什么都没留下…
展开
-
C++之初识多态(Visual Studio 2019)
此文章关于多态的代码全部是使用Visua Studio2019 (x86) 实现的,C++多态在不同编译器中的实现细节可能不同,所以部分情况下相同代码运行结果可能不同,在此声明。目录多态的概念多态的定义与实现虚函数虚函数的重写虚函数重写的两个例外C++11 override & final重载&重写&重定义纯虚函数及抽象类接口继承与实现继承多态的原理虚函数存在哪里?虚表存在哪里?多态的原理动态绑定与静态绑定多继承下的虚函数表就像 “叫” 这个行为,猫来完成时其叫声是 “喵喵喵” ,而狗则是 “汪汪汪”。还有原创 2022-07-06 16:38:54 · 1026 阅读 · 6 评论 -
C++之虚拟继承与继承的小总结
本来是想将虚拟继承的部分写在上一篇的,但是虚拟继承的分析实在有些复杂,为了方便我自己回顾,就干脆单写一篇吧。我们之前说过了,虚拟继承可以解决菱形继承的二义性以及数据冗余的问题,实际上它也就是因为这些问题而诞生的。我们就以一个结构最简单的菱形继承为例:当不使用虚拟继承时:可以很直观地看到类A的成员变量a在类C的对象c中存在了两份,并且,很明显这两份又分别存储于对象c中类B1与类B2成员变量所在的空间。也即: 当使用虚拟继承时:再次查看内存对象成员模型,可以看到,之前重复继承的类A的成员变量被存储到原创 2022-06-12 13:10:13 · 382 阅读 · 0 评论 -
C++之继承初识(不包含虚拟继承)
C++是一种面向对象的语言,而面向对象,有着三大特征——封装,继承,多态。关于封装,在我的其它博客中已经有过简单的介绍了。这里我将简单叙述一下面向对象的三大特征之二——继承。什么是继承继承机制是面向对象程序设计中,使代码复用的最重要手段,它允许设计者在保持原有类的特性的基础上进行扩展,增加功能。通过这种方法产生的新的类,被称为派生类;被继承的类。则称为派生类的基类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。继承的定义格式.原创 2022-06-11 21:16:46 · 453 阅读 · 0 评论 -
猴子分桃问题
链接:猴子分桃__牛客网来源:牛客网老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子原创 2022-05-28 14:59:12 · 972 阅读 · 0 评论 -
正数数组的最小不可组成和
链接:正数数组的最小不可组成和__牛客网来源:牛客网给定一个正数数组arr,其中所有的值都为整数,以下是最小不可组成和的概念把arr每个子集内的所有元素加起来会出现很多值,其中最小的记为min,最大的记为max 在区间[min, max]上,如果有数不可以被arr某一个子集相加得到,那么其中最小的那个数是arr的最小不可组成和 在区间[min, max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和请写函数返回正数数组arr的最小不可组成和.原创 2022-05-28 10:10:39 · 197 阅读 · 0 评论 -
C:递归输出九九乘法表
输出九九乘法表可以说是考验对循环的掌握的最经典问题之一。以普遍理性而论,可用循环做出来的都可以用递归做出来,反之亦然。由于一开始思维的局限性,一说用递归的方法来输出九九乘法表,下意识想到的便是创建两个函数——也就是如下代码中的cheng_shu()与bei_cheng()——毕竟当时用循环的方法输出是用了两个循环的。void bei_cheng(int i, int j) { \\为了我个人感官上的舒服,我将i与j的位置互换了 printf("%d * %d = %d\t", j, i,原创 2021-09-30 22:56:40 · 2127 阅读 · 1 评论 -
网络套接字
IP地址端口号初识TCP协议TCPTransmission Control Protoco传输控制协议TCP是传输层协议,它具有有连接,可靠传输 以及 面向字节流 的特点。有连接:TCP双方在发送数据之前会先“握手”以建立连接。以此确保对方可以正常进行通信,并且沟通双方发送后数据的细节,如序号等。可靠传输:TCP保证传输的数据是可靠的,数据有序的到达对面。面向字节流:虽然应用层与TCP的交互是一次一个数据块,但是TCP只是将应用层传输过来的数..原创 2022-05-24 13:24:14 · 927 阅读 · 0 评论 -
非递归前序遍历,中序遍历以及后序遍历
对于二叉树的前序遍历,中序遍历以及后序遍历的非递归解法,通常会引入一个栈用来存储二叉树中的节点。原创 2022-05-21 15:46:16 · 1619 阅读 · 0 评论 -
从中序与后序遍历构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例 1:输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/construct-binary-tr...原创 2022-05-19 14:19:19 · 729 阅读 · 0 评论 -
幸运的袋子
幸运的袋子——它使我不幸——由于在这里卡了太长的时间,我的计划全泡汤了。题目描述:链接:幸运的袋子__牛客网来源:牛客网一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的.原创 2022-05-09 22:52:52 · 293 阅读 · 0 评论 -
分割回文串
这道题是leetcode编号131,在剑指offer中也有本题。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。示例 1:输入:s = "aab"输出:[["a","a","b"],["aa","b"]]示例 2:输入:s = "a"输出:[["a"]]提示:1 <= s.length <= 16s 仅由小写英文字母组成来源:力扣(LeetCode)原创 2022-05-09 08:58:35 · 1447 阅读 · 0 评论 -
STL六大组件
前两天有一门考试,忙着复习,便有些懈怠了。也趁着清闲想了想感觉还是有必要把对STL整体来上一篇博客介绍一下的。STL首先,什么是STL?STLstandard template library标准模板库STL是C++标准库的重要组成部分,它不仅是一个可以复用的组件库,更是一个包罗万象的数据结构与算法的软件框架。STL主要有六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器。简单介绍容器:( containers )STL内部封装好的数据结构,从实现的角度来看,原创 2022-05-06 17:19:49 · 592 阅读 · 0 评论 -
string类的部分实现
可能会有讲解,但肯定不在本篇。今天没有学习的欲望。太多了,我甚至都没有测试完。#pragma once #include <iostream>#include <cstring>#include <cstdlib>#include <cassert>using std::ostream;using std::istream;using std::cin;using std::cout;using std::endl;na.原创 2022-05-03 20:31:32 · 245 阅读 · 0 评论 -
C++之模板
虽然C++中引入了函数重载的功能,使得我们可以在同一作用域中声明并定义几个参数列表不同的同名函数。原创 2022-05-02 13:54:08 · 1133 阅读 · 0 评论 -
#左值右值粗解
只是忽然被卡到这个概念了,做一个简单总结。后边推进到左值引用右值引用可能会好好讲一下。原创 2022-05-02 11:07:42 · 151 阅读 · 0 评论 -
sizeof与strlen的区别
原创 2022-05-01 13:22:42 · 335 阅读 · 0 评论 -
简单了解malloc的实现原理
想要进一步提升自己内存管理方面的理解,通过各种手段了解一下C语言提供的最基础的内存管理函数malloc的底层实现绝对是一个不错的方法。原创 2022-05-01 11:31:10 · 349 阅读 · 0 评论 -
C++动态内存管理
C/C++与Java,python最大的差别就在于C/C++需要用户自己来进行内存管理。内存管理可以带给C/C++大神更高的性能,更大的自由,带给萌新更多的BUG,更秃的头。原创 2022-04-30 22:26:13 · 2029 阅读 · 0 评论 -
C++类与对象收官
关键字:自加自减运算符重载,初始化列表,explicit关键字,static成员,内部类。自加自减运算符重载与其他的运算符不同,自加运算符与自减运算符是所有运算符中的一对奇葩——它们都只对一个对象进行操作,但是却又有两种不同的操作模式——前置与后置。这里我们以自加运算符为例。我们假设d1是date类的一个对象,那么++d1与d1++应该是不一样的,它们虽然都完成了d1 = d1 + 1//=与+运算符都已经重载这样的操作,但是,前者的返回值应该是对象d1被修改后的值,而后者的原创 2022-04-27 19:51:42 · 979 阅读 · 0 评论 -
C++类与对象再探
关键字:const成员函数,构造函数,析构函数,拷贝构造函数,赋值操作符重载,取地址重载,const取地址重载。const成员函数在C语言中有一个神奇的关键字,const关键字。它用以给其所修饰的变量赋以常性,即:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。(C)关于const的各种各样的用法在这里就不细讲了,有时间的话单独总结一篇博客(flag + 1)。这里我们只讨论const修饰类的成员函数。如上所言,const最重要的特征在于——常性原创 2022-04-23 20:09:11 · 1542 阅读 · 2 评论 -
C++类与对象之初识
关键字:类的引入,类的定义,访问限定符,类的作用域,类的实例化,类的大小计算,this指针原创 2022-04-20 11:55:20 · 589 阅读 · 0 评论 -
初识面向对象与面向过程
C语言与C++的差距应该从它们解决问题的思想上的差别讲起——面向过程与面向对象。面向过程:面向过程是一种最实际最基础的思考方式。面向对象的思想是把问题分解成为一个一个步骤,然后将每个步骤用函数实现,依次调用。...原创 2022-04-18 18:28:36 · 198 阅读 · 0 评论 -
C++之苦海无涯
所谓苦海无涯,回头是岸。关于C++的零散的基础的知识点,再往后,就真的是入门级别了。关键字:内联函数,auto关键字,范围for循环,指针空值nullptr。原创 2022-04-18 14:56:25 · 428 阅读 · 0 评论 -
简单了解函数调用过程
绝大多数C/C++程序是由一个个函数组成的。我们的程序执行主要做的就是执行组成它的一个个函数。而每一个函数想要执行的时候,编译器都会给它分配一块栈空间。这块栈空间主要用来存储这个函数在执行过程中使用到的局部变量、参数等等。这块栈空间往往被称之为栈帧。每个栈帧对应着一个未运行完的函数。从逻辑上讲,栈帧就是函数执行的环境,其内包含着函数的参数、函数的局部变量、函数执行完成后返回到哪里等等。int add(int a, int b) { int ret = a + b; re原创 2022-04-17 16:39:48 · 4208 阅读 · 2 评论 -
C++之引用
工具为了解决问题而创造出来,不要为了制造工具而制造工具。原创 2022-04-16 17:24:31 · 908 阅读 · 0 评论 -
以C的风格编译C++函数
在实际应用中,有时候可能为了兼容性等多半考量,可能需要将某些函数以C语言的风格来进行编译。C语言与C++在函数编译时的主要差距在于C++在编译时对于函数名会进行更加复杂的修饰,而C语言只是简单的在函数名前加上一个下划线“_”,这也是为什么C++支持函数重载而C语言不支持。在C++代码中,我们可以通过extern "C"来指定一段代码使用C语言风格进行编译。很容易看出的,extern "C" 由 extern 与 "C" 两个部分组成。extern对C语言或C++有过了解的朋友都原创 2022-04-15 16:10:02 · 520 阅读 · 0 评论 -
C++之函数重载
简单介绍了一下函数重载,大致讲解了一下Linux与VisualStudio中函数名修饰规则。原创 2022-04-14 20:36:19 · 723 阅读 · 0 评论 -
大概了解预处理、编译、汇编、链接
加入光荣的进化吧!原创 2022-04-14 18:24:48 · 615 阅读 · 0 评论 -
C++入门之开胃小菜
关键词:命名空间,cout(标准输出流),cin(标准输入流),缺省参数。本文章对cout,cin,缺省参数浅尝辄止。原创 2022-04-13 19:18:56 · 712 阅读 · 1 评论 -
交流的需要——进程间通信
进程间通信为什么要进行进程间通信我们都知道,每一个进程的数据都是存储在物理内存之中的。进程通过各自的进程虚拟地址空间,经过各自页表的映射关系,对物理内存进行访问。以32位的操作系统为例,32位操作系统的内存最大为4G,操作系统给每个进程都画了一张4G的大饼(进程虚拟地址空间),每个进程都以为自己有4G的空间,而实际上是操作系统在后方精打细算,管理着数据的存储以及页表的映射。进程只需要单纯地执行代码即可,这便保证了进程间的独立性。进程是一个独立的资源分配单元,通常情况下,进程之...原创 2022-04-12 14:28:49 · 1964 阅读 · 0 评论 -
简单了解一下Linux文件系统
好奇是进步的第一步。原创 2022-04-03 11:45:02 · 947 阅读 · 0 评论 -
不仅仅是程序本身——基础IO
关键字:C语言文件接口,系统调用文件接口,文件描述符,重定向,静态库与动态库,软链接与硬链接。原创 2022-03-30 22:39:19 · 452 阅读 · 3 评论 -
一个进程的一生
关键词助手:进程创建,进程终止,进程等待,进程程序替换。进程控制进程创建父子进程从一个已存在进程中创建一个新进程。新的进程为子进程,而原进程为父进程。创建子进程的方法——fork函数fork用于创建一个新的进程,调用fork()的进程被称为父进程,而被fork()创建的进程被称为子进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的程序计数器,相同的CPU寄存器,在父进程中使用的相同打开文件。#include <unistd原创 2022-03-25 23:50:20 · 802 阅读 · 3 评论 -
进程虚拟地址空间
关键词:进程虚拟地址空间,进程描述符,页表,分段式,段页式。在进入正式的内容之前,我们先了解一个重要的概念——进程描述符PCB。在Linux操作系统中,描述进程的结构体叫做task_struct。Linux操作系统通过task_struct感知进程的存在。task_struct结构体中的内容:标识符:描述本进程的唯一标识符,又来区别本进程与其他进程。状态:进程的状态,退出信号等等优先级:相对于其它进程的优先级。程序计数器:存储着程序中下一条将要执行的指令的地址。内存指针原创 2022-03-16 20:59:05 · 2854 阅读 · 2 评论 -
那些年,那些排序
关键词助手:排序,冒泡排序,快速排序(hoare版、挖坑法、前后指针法),快速排序非递归,选择排序,堆排序,插入排序,希尔排序,归并排序,计数排序。原创 2022-03-15 15:21:26 · 135 阅读 · 1 评论 -
&&短路评估实战——限定条件下的加和(出自剑指offer)
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。首先,我们要了解文章标题中的短路评估的含义:在一个A&&B的判断中,如果前者的布尔值为false,那么则会跳过对B的判断。PS.暂时找不到官方的文字。我们可以用&&的这个特性来完成本该由if语句完成的功能。class Solution {public: int Sum_Solution(int n.原创 2022-02-12 10:31:25 · 247 阅读 · 0 评论 -
关于拷贝构造函数
众所周知,四大天王不是四个,由此易得,空类不空。开个玩笑。在C++的规则中,不允许对象像一个幽灵一般飘荡在内存之上,每一个对象都必须都必须有一个地址与其对应。以此来区分两个对象是否是不同的对象。当一个对象被生成时,系统会自动生成6个默认成员函数:1.构造函数—— [类名]()2.析构函数—— ~[类名]()3.拷贝构造函数—— [类名](const [类名]&)4.赋值运算符重载—— [类名]& operator=(const [类名]&原创 2022-02-11 13:08:56 · 580 阅读 · 0 评论 -
关于结构体对齐
首先我们先了解一下各数据类型所占的字节数x64系统(64位)x86系统(32位)在这里有一个很有意思的点,我使用VS在x86与x64系统下运行出来的long类型所占据的空间都是4个字节,这与我们之前在书上所学的不同,按照部分(我也不敢确定所有)的C语言书上所说,在64位操作系统下,long类型的大小应该是8个字节的,但这明显与上方结果不同。为此,我特意又到了64位的Linux虚拟机上检测了一下,所得结果如下:之后又查询了更加专业的资料,可知l...原创 2022-02-06 16:46:11 · 1040 阅读 · 0 评论 -
二叉树的前序,中序,后序遍历
二叉树的前序遍历,中序遍历与后序遍历——这是我个人所认为的在二叉树的学习中最难的一个知识要点,故与此记录。至于为什么觉得它难,那就是历史遗留问题了,关于我饭点的经常性走神以及过去我对于某些知识点的记忆理解方法,其中实在过于复杂,在此不表。前序遍历,中序遍历,后序遍历。在理解这三个知识点的时候我们最好不要将它们分开来看,而是将它们放在一起,比较之中寻不同,从而记忆理解。先看看比较官方的说法:1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历原创 2022-01-23 19:43:17 · 498 阅读 · 0 评论 -
Linux之gdb——发现、定位
在最初使用Windows编程的时候不同,使用Linux进行编程的过程中,如果遇到程序有什么问题我们很难像在VS以及keil中一样,直截了当的在程序对应语句最左侧打下一个断点,便可以进行对问题的进一步定位与分析。Linux中的调试工具——gdb,并不如VC、BCB等IDE的调试那般便捷,甚至对于像我这样的刚开始接触Linux编程的菜鸟来说可以称得上有些“困难”,因此gdb的使用也就成了一个可以拿出来讨论的话题。以下,我将根据我目前所学所了解到的一些gdb的使用方法及要点做出简单总结,如有谬误,欢迎指正。原创 2022-01-07 18:45:58 · 1446 阅读 · 0 评论