【C++】文件IO流
一起来康康C++中的文件IO操作吧 [TOC] 1.operator bool 之前写OJ的时候,就已经用过上面这种方式来获取多组测试用例 12345string s;while(cin>>s){ cout << s << endl;} 不过之前一直没有去了解这里的底层原理是什么,借此机会一并说明 io流可以进行while判断的依据,是因为库的源码中重载了operator bool 没错,operator不仅可以重载一个操作符,它还可以重载一个类型!即将这个类转换为bool类型,return 一个bool类型的值用于while的判断 同理,重载int/double这些类型都是可行的! 另外,要想停止上面的多组输入,在VS下可以用ctrl+z的方式解决,而不要用ctrl+c直接杀掉进程 2.C++文件IO流 C++的文件io类设计的较为复杂,其中还出现了菱形继承,也就是我们最常用的iostream 上面提到的operator...
【C++】类型转换方法
本篇博客让我们来见识一下C++中新增的类型转换方法 [TOC] 1.C语言中类型转换 在C语言中,类型转换有下面两种形式 隐式类型转换 显示强制类型转换int a=(int)'c' 这两种方式想必各位都很熟悉了,但隐式类型转换在一些场景里面会出现问题 123456789void insert(size_t pos,char c){ int end=10; while(end>=pos) { end--; } ...
【C++】特殊类设计 | 单例模式
本篇博客让我们来康康一些特殊类的实现方式! 1.不支持拷贝的类 在一些场景下,比如智能指针、多线程操作、IO流等是不支持拷贝的。因为它们的拷贝会导致一些问题,秉着解决不了问题,就解决提出问题的人的思路,禁止了这些类的拷贝 C++98中,可以将拷贝构造和=重载只声明不定义,并将其访问权限设置为私有 设置为私有可以防止其他人在类外定义 C++11中,提供了一个特殊的关键字delete来禁止实现拷贝构造和 =重载 12345678910111213141516171819202122// 禁止拷贝的类class BanCopy{public: //构造 BanCopy() { _a = _b = 0; } //C++11 BanCopy(const BanCopy& c) = delete; BanCopy& operator=(const BanCopy& c) = delete;private: //C++98的办法,声明为私有且不定义 ...
【C++】空间配置器
空间配置器,听起来高大上,那它到底是什么东西呢? 1.什么是空间配置器? 空间配置器是STL源码中实现的一个小灶,用来应对STL容器频繁申请小块内存空间的问题。他算是一个小型的内存池,以提升STL容器在空间申请方面的效率 2.了解空间配置器 STL以128个字节为分界线,将空间配置器分为了一级和二级 2.1 一级 一级空间配置器中,allocate/deallocate函数实际上就是对malloc/free做了一个简单的封装 123456789101112131415161718192021222324252627static void * allocate(size_t n){ void *result = malloc(n); if (0 == result) result = oom_malloc(n); return result;}static void deallocate(void *p, size_t /* n */){ ...
【Linux】简易shell的实现
本篇博客,来教大家用C写一个简易的linux shell,帮助理解之前学习的进程控制相关知识 演示系统:CentOS7.6 [TOC] 前言 之所以说是简易的shell,是因为我们现在的水平肯定写不出来linux系统里面那么复杂的shell。 我们的目的仅仅是为了学习父子进程、进程替换、内建命令等等知识,并把这些知识的作用通过这个小shell体现出来 源码仓库:gitee 1.基础框架 之前的学习中有提到过,我们在linux命令行内运行的很多进程,都是以子进程的方式运行的。说白了就是bash进程里面给我们fork创建了其他子进程,再用子进程进行进程替换,指向对应的可执行文件 而需要做到这一点,我们要一步一步来 bash首先要显示命令行的提示符用户名@主机名 路径(参考之前vim博客中的进度条程序) 获取用户的输入内容 从用户的输入中,以" "空格为分割,分离出命令和参数 fork创建子进程,子进程执行进程替换,父进程等待子进程结束 这一切都是在一个while(1)的死循环里面执行的,bash本质上就是一个死循环的父进程 2.开整一个 2.1...
【Linux】进程控制
阿巴阿巴,进程概念结束了,现在该学习如何控制一个进程了 所用系统:CentOS 7.6 [TOC] 1.进程创建 1.1 fork 关于linux下的进程创建其实我们已经接触过了,那便是使用fork函数来进行操作 1pid_t ret = fork(); fork的返回值:子进程返回0、父进程返回子进程pid;出错返回-1 小tips,其实pid_t就是int类型! 1typedef __pid_t...
【Linux】进程地址空间
本篇博客来认识一下linux下程序地址空间的概念 演示所用系统:CentOS 7.6 [TOC] 1.引入程序地址空间 之前学习C/C++的时候,多少应该都听过栈区/堆区/静态区/全局区的概念,还有一张很经典的演示图,大部分讲解这几个内存区域的图片都和下图类似 但是有一个问题,这里的程序地址空间,是我们的物理内存上的东西吗? 并不是! 程序/进程地址空间是操作系统上的概念,它和我们物理内存本身不是一个东西 1.1 验证不同区域 用下面这个代码来简单验证一下不同区域上的区别 12345678910111213141516171819202122232425262728293031323334353637383940#include<stdio.h>#include<stdlib.h>int un_global_val;//未初始化全局变量int global_val=100;//已初始化全局变量//main函数的参数int main(int argc, char *argv[], char *env[]){ ...
【Linux】进程概念解释和linux环境变量
进程相关概念解释和linux环境变量
【C++】异常处理
本篇博客让我们来认识一下C++中对于异常的处理机制 [TOC] 1.概念 1.1 C语言对于异常的处理 在之前我们遇到一些bug的时候,通常会用if判断或者assert断言等问题进行处理。但这种方式太过暴力,会直接中断程序的运行 另外一种办法是返回错误码,C语言的报错大多使用这种方式。不过这需要程序的用户自己去查对应的错误码表格,较为麻烦 1.2 C++异常 所谓异常,便是程序运行过程中可能遇到的bug或者问题。程序可以有选择地抛出一个异常,告知用户程序运行出现了问题。 C++标准库中便使用了一个exception类来进行异常的处理,我们运行程序中遇到的一些报错,其实就是标准库里面抛出了对应的异常 其操作主要借助下面三个关键字 throw 在出现问题的地方抛出异常 try 监控后续代码中出现的异常,后续需要以catch作为结尾 catch...
【C++】C++11的那些新特性
本篇博客,让我们一起来看看C++11的那些新特性! 所使用的编译器:VS2019 本篇博客所有的测试源码都可以在我的GITEE仓库找到 [TOC] 1.前言 C++11是C++的标准委员会在2011年更新的C++新特性。说白了就是一个升级包。和JAVA\PYTHON这种更新比较频繁的语言相比,C++更新的就没有那么顺风顺水了,而且每一次更新虽然修复了一些问题,但也带来了更多的“没太大必要”的更新 比如没啥用的array容器,和int arr[10]这种内置方式的区别主要在于越界检查 不过咱们这种小菜鸡,只有学习的权力,哪有啥资格评定C++标准呢?我听大佬说,现在最关注的C++更新便是网络库的上线了,不过那个貌似得等到C++23去了 话不多说,让我们来康康一些C++11的新功能吧! 2.列表{}初始化 C++11更新了初始化方式,不管是什么类型的数据,我们都可以用花括号的方式进行初始化 123456789struct TestA{ int _a; int _b;};void TestInit(){ ...