- 博客(35)
- 收藏
- 关注
原创 C++多态
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。public :public :cout << "Benz-舒适" << endl;} };
2023-05-08 23:17:55 98
原创 Linux文件系统
先解决之前的遗留问题前面说到,C标准库不是会默认打开三个文件流吗,其中stdout和stderr对应的硬件都是显示器,那么这俩有啥区别呢?
2023-04-29 22:35:44 110
原创 文件描述符2
而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件图解。
2023-04-26 20:11:40 141
原创 Linux下IO操作
你不是说你Linux下一切皆文件吗,这样的话,键盘、显示器自然也可以被看成是文件,但是既然是文件的话,我们为什么从来没有打开过这些文件就能够进行scanf、fgets、printf、cout呢?就像我们写c语言的时候肯定要先打开这个文件,然后再对文件进行读写,但我们对键盘或者显示器读写的时候却没有打开,这是为什么呢?其实C/C++程序,默认就会打开三个文件流上面三个分别是。
2023-04-22 17:04:15 88
原创 C++继承
C++访问限定符有公有(public)、保护(protected)、私有(private)继承方式也是这三种:共有继承、保护继承和私有继承。
2023-04-14 21:45:19 56
原创 模板进阶——非类型参数、特化、分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。Add(1 , 2);return 0;这段代码在编译的时候会出现链接错误链接错误的原因就是找得到声明但是找不到定义,函数是在头文件中声明的,所以main函数包含了头文件后就能找到函数的声明,但由于.cpp文件之间是分离编译的,在a.cpp中T无法确定,函数也就无法实例化,没有定义自然就会出现链接错误。
2023-04-13 21:17:44 113
原创 C++反向迭代器
其中迭代器在不暴露底层细节的情况下,提供了统一的方式去访问容器,屏蔽底层细节,体现了封装的价值和力量。迭代器也可以称之为算法和容器之间的融合剂,使得不同的算法都能够用迭代器访问容器,这样不同的容器都能够使用相同的算法。其中我们了解了迭代器之后,如果要我们自己实现反向迭代器你会怎么实现呢?可能我们一般都会这样想,对于list拷贝一份正向迭代器的实现,然后把里面的++,–函数改一下,这样list的反向迭代器就生成了,那么vector呢?
2023-04-12 21:21:05 65
原创 queue——priority_queue
优先级队列也是一个容器适配器,它的底层数据结构是用堆来实现的,用数组来模拟堆,所以它的底层容器也就是vector,后面是一个仿函数,大概就像sort函数一样,你可以提供自己的比较函数。priority_queue默认数值更大的优先级更高。当然我们也可以指定小的优先级更高,第三个参数指定为greater就行这个greater在头文件functional中。
2023-04-11 23:11:12 190
原创 stack&&queue
我们观察stack和queue的文档发现,stack和queue是没有迭代器的,这是由于stack要满足先进后出的特点,而queue要满足先进先出的特性,如果存在迭代器随意遍历的话,就会破坏这个特点。queue模拟实现。
2023-04-10 23:17:18 51
原创 Linux进程控制之进程替换
ctrl+v、G、I,整体插入我们调用fork()函数创建了一个子进程后,父子进程是共享同一份代码的,但是我如果想要子进程执行一个全新的程序呢?就可以完成这个功能,是通过特定的接口,加载磁盘上一个程序(代码和数据),加载到调用进程的地址空间中,其实就是将磁盘上的新的程序加载到内存,并和当前进程的页表,重新建立映射。由此,我们可以得知,进程替换并没有创建新的进程。显然进程替换的关键就是,如何将所谓新的程序加载到内存中,函数就是加载程序的函数。
2023-04-07 23:37:26 51
原创 进程非阻塞等待
那这个非阻塞等待有啥用呢,当父进程检测到子进程还在运行时,waitpid函数就会直接退出,父进程就可以去执行其他的任务,隔段时间再调用waitpid函数,只要子进程没结束父进程就去执行别的任务,只要子进程结束了父进程就可以释放掉僵尸进程,这就是基于非阻塞调用的。阻塞等待就是,操作系统检测到子进程没有结束时,父进程就阻塞挂起,然后一直等到子进程运行结束父进程就被唤醒。非阻塞等待就是,如果子进程没有退出,waitpid这个系统调用就会立马返回,而不用一直等待着子进程结束。所以进程阻塞,本质还是在函数内部阻塞!
2023-04-06 18:46:48 150
原创 Linux进程控制之进程等待
进程异常退出,或者崩溃,本质是操作系统杀掉了你的进程,其中操作系统通过发送信号的方式杀掉进程,如果进程是正常退出的,那么进程收到的信号就是0,如果进程是被异常终止了,那么退出码也就没意义了,status的次低八位也为0。如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退。其中低七位中保存的是进程的终止信号,还有一个标志位是gdb调试崩溃程序信号,次低八位保存的是进程的退出码。当正常返回的时候waitpid返回收集到的子进程的进程ID;
2023-04-05 22:44:18 86
原创 String类常用方法
这俩是一个类型的,把从pos开始的n个字符,或者把从i1到i2的字符,替换成str,str也可以是字符指针这俩函数都是既指定dst的起止位置,又指定src的起止位置前面两个参数是dst的,后面三个是src的这个仅此是吧起止位置替换为n个char字符。
2023-04-03 23:17:23 50
原创 Linux进程创建
创建子进程,给子进程分配对应的内核数据结构,必须子进程自己独有,因为进程具有独立性!理论上,子进程也要有自己的代码和数据,可是一般而言,我们没有加载的过程,也就是说,子进程没有自己的代码和数据,这样的话子进程就只能使用父进程的代码和数据代码:都是不可被写的,只能读取,所以父子共享,没有问题。数据:可能被修改的,所以必须分离。
2023-04-03 20:35:32 50
原创 Linux进程地址空间(二)
这样就有效地保护了物理内存因为地址空间和页表是OS创建并维护的!也就意味着凡是想使用地址空间和页表进行映射,也一定要在OS的监管之下来进行访问。保护了物理内存中的所有合法数据包括各个进程,以及内核的相关有效数据。比如你用一个非const指针指向一个字符串常量,并做修改,这样进程就会被操作系统直接杀掉。
2023-04-03 18:27:14 50
原创 Linux进程地址空间(一)
当我们定义一个全局变量,并且用fork()创建一个子进程,在子进程中改变这个全局变量,我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:变量内容不一样,所以父子进程输出的变量绝对不是同一个变量但地址值是一样的,说明,该地址绝对不是物理地址!在Linux地址下,这种地址叫做虚拟地址我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址。
2023-04-02 17:35:51 89
原创 Linux环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。比如在Linux操作系统中,我们执行系统命令就不需要带地址,我们呢执行自己的程序就需要./
2023-03-30 23:22:09 45
原创 Linux操作系统进程状态
新建:字面意思运行:task_struct 结构体在运行队列中排队,就叫做运行态阻塞:等待非CPU资源就绪,阻塞状态挂起:当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,进程的状态就叫做挂起。
2023-03-30 18:57:26 82
原创 Linux调试器-gdb使用
gcc && g++ 默认形成的可执行程序是release的,因此无法调试若要编译形成debug程序,在后面加上-g选项即可。
2023-03-22 21:49:25 57
原创 版本控制器git
什么是版本控制?比如你写了一份简历(版本1),然后老师看过之后让你改改,然后你把版本1拿回去,把版本1备份后修改,得到了版本二,老师看过之后依旧不是很满意,你又把版本2拿回去备份,修改后得到了版本3,老师看过止后直接让你把版本2拿回来,让你再在版本2的基础上进行修改,你修改后得到了版本2.1上述过程就叫做版本控制,从版本3到版本2的操作就叫,回到版本2后,得到版本2.1,这叫做。程序员写代码实现这个版本控制的过程(版本控制器,git 或 svn)
2023-03-22 19:40:31 49
原创 Linux编译器-gcc/g++使用
gcc只能用来编译c,g++可以编译c也可以编译c++下载g++编译器 sudo yum install -y gcc-c++gcc file.c -o file 即可完成编译** 记得-o后面跟着编译形成的可执行程序名即可**
2023-03-20 18:36:23 179
原创 常见权限问题
如果你是拥有者那么就只看文件的拥有者权限,如果你是所属组,那么就只看你的所属组权限 例如:如果你同时为文件的拥有者和所属组,那么就只看拥有者权限,不看所属组,因为权限只被认证一次查看目录下面的文件列表:r(例如ll)要在目录下创建文件或目录:w(例如touch mkdir)
2023-03-16 20:54:42 66
原创 Linux权限理解
外壳程序的意义:1.是用户和操作系统交互的中间软件层2.可以在一定程度,起到保护操作系统的作用 eg:用户提出的不合理请求被外壳程序直接拒绝,根本就没有传达给操作系统。
2023-03-15 22:37:16 47
原创 Linux下用gcc编译C文件
hello.c为我想要编译的c文件,hello为编译后形成的可执行程序文件名。也可 gcc hello.c 这样形成的可执行文件为a.out。./hello.c即可执行。
2023-03-15 19:54:01 272
原创 关于sacnf返回值的问题
在学C语言的时候,关于scanf的返回值一直有些疑惑,它的返回值到底返回什么呢,特别是什么时候会返回EOF呢,是不是只要读不到正确的值就会返回EOF呢?下面来探究一下。下看一下这段代码int main(){ int a = 0; while(scanf("%d", &a) == EOF) { printf("hehe\n"); } return 0;}如果我们直接输入一个字母,那么显然与a的类型不匹配,那么此时scanf什么都没有读到,那么它的返回值会是EOF吗?该代码
2022-04-22 18:05:54 1216
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人