自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 错题本知识点总结C语言篇

位段:“:”后的数字代表占用比特位大小,32位CPU,unsigned 占4字节,32个比特位,a,b占4个字节,c占4个字节,d占4个字节。B 因为"abc"是常量字符串,当它被多次使用时,编译器并不愿意再多分配出额外的内存空间存放多个"abc",而是重复使用这一个"abc",所以,scX和scY指针会指向同一个地址。而位域这种数据结构的缺点在于,其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。这n个字符输出在m列的右侧,左补空格。

2024-03-14 10:49:22 271

原创 C++多态

由于在定义在父类指针是可以强制类型转化,即我定义一个子类对象,将其地址给父类指针,这个操作是可以的,但是我同样可以定义一个父类对象,将其地址给父类指针。此时如果进行析构,在没有将析构函数定义为虚函数时,在析构时会按照定义的类型调用其析构函数,也就是说会调用两次父类的析构函数,但是我第一个明明是子类对象,因此我们一般将析构函数定义为虚函数。并且必须父类返回父类指针,子类返回子类指针。多态的本质原理:符合多态的两个条件,在调用时,会到指向对象的地址中看对象的虚表找到对应虚函数地址,进行调用。

2024-01-26 03:44:47 83

原创 缓冲区相关知识

缓冲区一般存在于struct_file中(即文件描述符所在的结构体中,保存了文件的大部分信息),一般情况下数据都放在缓冲区内,当遇到刷新时,将缓冲区内数据全部刷新,减少与I/O的交互次数,提高效率。一般而言,行缓冲的设备文件 -- 显示器。全缓冲的设备文件 --磁盘。

2024-01-25 09:38:19 343

原创 进程终止相关问题

前两种情况,main函数返回值代表程序运行结果的正确性,返回值也是进程的退出码,会将这个码返回给上一级进程,用来评判该进程的执行结果。c._exit(退出码)在任何地方调用都表示直接终止。b.exit(退出码)在任何地方调用都表示直接终止。因此终止时要释放进程申请的相关内核数据结构和对应的代码和数据。由于 进程=内核数据结构+相应的代码和数据。a.main函数中的return+退出码。1.进程终止时,操作系统做了什么?程序崩溃的情况下,退出码没有意义。3.如何用代码正确终止一个进程。代码跑完,结果不正确。

2024-01-10 14:00:44 355

原创 环境变量相关内容

当cpu在执行指令时,先去拿进程地址空间的虚拟地址,然后再去页表找映射的物理地址,然后根据物理地址中的代码,返回下一条指令的虚拟地址,然后再去页表找映射。几乎所有语言中,如果有“地址”的概念,那么他们的地址都不是真实的物理内存,而是虚拟地址(线性地址)。但是当发生改变时,会发生写时拷贝,所以其实他们两个有自己的物理空间,但是用同一个虚拟地址表示(一开始拷贝完时,物理地址也一样,改变的时候物理地址会变)。上述的映射机制是由操作系统来进行维护的,是一种表结构,叫做页表(每个进程私有一份)。

2024-01-09 21:29:04 351

原创 C++模板初阶

但是当模板参数不支持隐式类型转换,例如我写了一个Add的模板并且模板参数只有一个时,传入两个参数A和B其中一个是int,一个是double,那么就会出错,因为int不等于double,两种方式解决,一种是我用的时候自己强制类型转换,将两个变量转为同一个类型如:Add((int)1.1, 2)主要是两部分组成,模板参数推演以及推演参数实例化,会对你使用这个函数的具体场景进行推演,得到参数类型,然后根据函数模板进行实例化得到不同参数的许多函数。类模板:就是将一个类中的各个变量类型改为虚拟,以便于自己定义。

2023-12-25 18:47:03 300

原创 动态内存管理

打印char*的地址时不要用C++的cout,因为会识别为字符,产生乱码。从底层来看,new和delete是在底层调用了两个函数分别是:operator new和operator delete。当malloc成功时会返回1,失败返回NULL,而new失败会抛出异常,所以不用检查返回值。针对内置类型,new和delete与malloc和free没有区别。当然在delete也会调用析构函数清理对象中的资源,然后释放空间。C++在开辟空间自定义类型空间是会调用构造函数自动初始化。malloc:申请空间。

2023-12-25 15:38:15 401

原创 友元类和内部类

此时,在Time类中声明Date是它的友元类,因此在Date中可以直接访问Time的私有成员,但在Time中不能访问Date的私有成员。同时,友元关系不能够传递。A和B可以认为是同等关系,但是B受限于A的类域,即在定义B时要用访问限制符,同时B天生是A的友元,B可以访问A的私有,但A不能访问B的友元。将A类定义在B类的里面那么则称A是B的内部类。由于友元类突破了C++的封装,因此尽量少用。就是在类定义中声明谁是自己的友元类,例。

2023-12-22 16:50:59 354

原创 static成员

静态成员变量初始化:只能在类外面进行初始化,并且不用加static。因为成员变量的定义都在初始化列表里,而初始化列表不能定义静态成员变量,因此初始化列表不能初始化静态成员变量。静态成员变量是所有类对象所共有的,不属于某个单独对象,存放在静态区。类中的成员变量由static修饰的成为静态成员变量,同理静态成员函数。静态成员函数:没有this指针,不能访问非静态成员变量。最常用的应用场景:统计类被创建了多少次。

2023-12-22 12:41:13 342

原创 explicit关键字

其实是不一样的,上面是直接调用构造函数,下面是先构造再进行拷贝(但由于现在的优化,所以也是直接调用构造函数),因为2022和d2类型不符,所以要先将2022赋值给一个Date类型的临时变量再将临时变量利用拷贝构造赋值给d2.但是加入explicit关键字后可以防止隐式类型转换。用法:在构造函数前加 explicit,例。如图,这两个定义d1,d2的方式一样吗?

2023-12-22 10:30:38 364

原创 初始化列表

因此,const变量必须在初始化的地方定义且只有一次,所以只能在初始化列表里进行初始化,因为const变量也不能更改值,同理引用成员变量也是这样。当有默认构造函数时,初始化时就会认得,所以不会报错。还有一些要注意的点:如上图所示,初始化列表在初始化时是谁先声明就先初始化,就是说无论初始化列表里的顺序如何,都是按照下面的声明顺序进行初始化的。当我们在初始化类对象时,对象通常会包含其他自定义成员变量,那么此时初始化这些类会比较麻烦,如下图,类不能初始化,因为_hour是私有的。ok,那么初始化列表什么样子呢?

2023-12-21 21:47:12 299

原创 进程相关内容

当内存中包含许多程序的代码和数据时,为了便于管理,计算机会对每一个程序形成一个PCB结构体,包含其程序所有的属性(在内存中的位置、什么时间操作、谁操作等)为了便于管理每一个PCB,所有PCB形成了一个链表,所以PCB中还包含上一个PCB的位置和下一个PCB的位置。系统中存在许多资源,网卡、磁盘等,当多个进程都想访问磁盘时,由于跟CPU没太大关系,CPU就会让这些进程去相应的资源后面排队,轮到之后CPU会让这个进程插队,进行访问。孤儿进程: 子进程没结束时,父进程先结束了,此时子进程叫做孤儿进程。

2023-12-21 09:52:09 855

原创 Linux下用gdb调试代码的基本指令

gdb进入:首先在生成可执行程序时要添加 -g选项使得生成debug版本的可执行程序,然后调用命令: gdb test(这个是可执行程序的名字)即可。delete(可简写为d):后面跟数字表示删除第几个断点。next(可简写为n):逐过程调试,遇到函数时将函数时为一条语句直接执行,不进入函数。list(可简写为l ):显示代码, l 0 表示从第0行开始显示。breakpoint(可简写为b):后面跟行数表示在第几行打断点。run(可简写为r):开始调试,如果没有打断点,直接运行。

2023-10-30 12:28:34 48

原创 进度条小程序

行刷新是指没有遇到\n的情况下等到一行的内存满了之后再进行显示,如果遇到就进行刷新,这也是上面那段代码不会先显示的原因。把数据放在了缓冲区,等执行完了休眠操作后再进行刷新显示。因为有缓冲区的存在,所以不换行的情况下用\r回车进行进度条显示,用fflush进行强制刷新。回车换行:回车是指回到这一行的最开始,换行是指换到光标所在位置的垂直下方。这段代码不会先显示ok再等待,而是先等待再显示,因为有缓冲区的存在。几个问题:缓冲区、回车换行、fflush、行刷新。代码:printf("ok")

2023-10-22 16:48:12 34

原创 make和makefile

并且.PHONY所修饰的伪目标总是会被执行的。一般来说,如果是像上面的代码,多次调用make指令是不起作用的,只会报出“文件是最新的”一个文件会有三个时间:Access:文件访问时间(如果每次读取都记录的话,会降低磁盘效率,所以只有累积到一定量才会记录一次)现在写一个实际的makefile,假设三个文件,main.c, test.c, test.h。注:make命令在执行时,是自上而下执行的,只会自动执行第一对依赖关系和依赖内容。Modify:修改内容的时间(文件有内容,也有属性,这里指修改内容的时间)

2023-10-22 13:58:58 41

原创 动态链接和静态链接

1.动态链接,依赖动态库:在链接过程中,将动态库中函数的实现方法的地址写在可执行程序中,要用的时候去相应的地址中找。2.静态链接,依赖静态库:在链接过程中,将库中的实现方法直接拷贝至可执行程序中,用的时候不用去找,自己本身就有。头文件提供方法声明,库提供方法实现。

2023-10-22 12:24:09 36

原创 Linux下gcc使用

gcc -o test test.c :在-o后面的是生成可执行程序的名字,也可以写为 gcc test.c -o test。gcc -c test.s -o test.o :将汇编文件(也可以是原始的.c文件和预处理.s文件)生成一个可重定位目标二进制文件。gcc -S test.i -o test.s :将预处理后的文件(也可以是原始的.c文件)生成一个汇编文件.s。gcc -E test.c -o test.i :生成一个预处理后的文件test.i。完成一个test.c文件时。

2023-10-22 10:01:19 38

原创 Linux中vim的命令行

r:将当前光标位置进行替换,nr表示将当前光标位置后n个位置替换成相同内容。x:删除当前光标所在位置的字符,nx表示删除当前光标位置后的n个字符。shift+r:进入替换模式,从光标起始处开始直接覆盖写过的内容。shift+~:切换当前光标位置处的大小写(大变小,小变大)yy:将所在行进行复制,nyy表示复制从当前光标开始的n行。dd: 删除当前行并复制,ndd表示删除从当前行开始的n行。h, j, k, l = 左, 下, 上, 右。G:光标定位到最后一行 nG表示定位到第n行。

2023-10-21 14:27:40 66

原创 C++拷贝构造函数与运算符重载

所以当我们在调用拷贝构造函数时,会先将变量复制给临时变量,在这个过程中有会自动调用拷贝构造函数,但是在调用拷贝构造函数时,又会发生将变量复制给参数的情况,这时又会产生新的临时变量,又会再调用拷贝构造函数进行复制,又会产生新的临时变量,这样会无穷递归下去,直到栈溢出。在我们使用类时,不可避免的会进行一些类的运算,例如日期类加100天是哪个日期等,但由于我们的运算符只支持内置类型,使用我们必须对运算符进行重载操作使其支持自定义类型运算。很多情况下,我们会需要去复制一个相同的类出来,所以就会用到拷贝构造函数。

2023-09-10 19:18:40 37

原创 C++构造函数与析构函数

与构造函数类似,当我们不写析构函数时,C++会自动生成一个析构函数,对内置类型不进行处理,自定义类型去定义的地方找它的析构函数,所以有些函数即使在使用使用了malloc()函数也不用写析构函数,因为它是在其它类中进行malloc的,清理时去它对应的定义中找析构函数即可,不用在自己的类中找。由于在没有写构造函数时,C++会自动生成一个只初始化自定义类型参数的构造函数,很不方便,因为没有初始化内置类型函数,所以在C++11时打了一个补丁,在声明成员变量时进行赋缺省值。这不是初始化,而是给了一个缺省值。

2023-08-31 19:34:35 34

原创 C++基础知识点

在C++下可以对变量在不同命名空间取相同的名字,通俗来讲就是我的这个名字是在这里定义的,你的是在那里,所以使用时要区别开,例如定义命名空间,namespace std{ int a },使用时可以std::a,也可以全部展开,即using namespace std,也可以展开要用的,using std::a,然后下面就就可以直接用a。由于C编译器不认识#ifdef __cplusplus,所以预处理时不会看到extern "C",不会报错,并且可以在C++编译器下被识别,按照C的规则来生成静态库。

2023-08-25 11:31:40 29

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除