- 博客(17)
- 收藏
- 关注
原创 第14章重载运算与类型转换
14.1基本概念二元运算符:左侧对象为第一个参数,右侧对象为第二参数除了重载的函数调用运算符()外,其他重载运算符都不能含有默认实参。如果一个运算符函数是成员函数,则它的第一个左侧运算符对象隐式绑定到this指针上,因此成员运算符函数的参数数量比运算符的运算对象总数少一个。重载的运算符函数,或者是类成员,或者至少含有一个类类型参数(不能都是内置类型,因为不能改变内置类型运算符的含义)//非成员函数运算符的等价调用data1+data2;operator+(data1,.
2021-11-07 14:58:51
153
原创 第十三章 拷贝控制
一个类通过定义五种特殊的成员函数来控制对象,包括:拷贝构造函数,拷贝赋值运算,移动构造函数,移动赋值运算符和析构函数。拷贝构造函数和移动构造函数定义了当用同类型的另一个对象初始化本对象时的操作,拷贝和移动赋值函数定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。13.1 拷贝、赋值与销毁13.1.1 拷贝构造函数 拷贝构造函数:第一个参数必须是引用类型(自身引用),并且基本上都是const &class Foo{p...
2021-11-05 15:25:11
198
原创 信号基础知识
信号的机制 进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号。处理完毕以后再继续执行,与硬件中断类似(软中断),每个进程收到的所有信号,都是由内湖负责发送的。信号的处理方式执行默认动作 忽略信号(丢弃不处理) 捕捉信号(调用用户的自定义的处理函数)信号相关函数signal函数:作用:注册信号捕捉(处理)函数 函数原型 typedef void(*sighandler t)(int);...
2021-08-23 15:03:06
304
原创 内存映射区
存储映射I/O 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可以在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。mmap函数void *mmap(void *addr,size_t length, int prot, int flags , int fd, off_t offset);参数:addr:一般传NULL,表示让内核去指定一个内存起始地址...
2021-08-20 10:00:57
274
原创 进程间通信(FIFO管道)
FIFO常被称为命名管道,以区分pipe,pipe只能用于“有血缘关系”的进程间通信。但通过FIFO,不相关的进程也能交换数据。 FIFO是linux基础文件类型中的一种(文件类型为p,可通过ls -l查看文件类型),但FIFO文件在磁盘上没有数据块,文件大小为0,仅仅用来标识内核中一条通道。进程可以打开这个文件进行read/write,实际上是在读写内核缓冲区,这样就实现了进程间通信。创建FIFO管道进程间通信流程进程A 创建一个fifo文件,使用mkf...
2021-08-19 22:11:31
397
原创 进程间通信(pipe管道)
Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制成为进程间通信(IPC)进程间通信的方式最常用:管道(最简单) 信号(开销最小) 共享映射区(无血缘关系) 本地套接字 (最稳定) 管道管道的原理:管道的实...
2021-08-19 21:10:13
210
原创 进程的创建回收
Linux的进程控制块就是task_struct结构体。创建进程:fork函数:函数作用:创建子进程 原型:pid_t fork(void); 返回值:调用成功:父进程返回子进程PID,子进程返回0 调用失败:返回-1,设置erno值 测试全局变量在父子进程中是否可以共享: 不可以共享,所以就不能使用全局变量进行通信。实例代码: 1 //测试全局变量是否可以共享 2 #include<std...
2021-08-19 15:07:51
79
原创 文件操作相关函数
stat/lstat函数函数描述:获取文件属性函数原型:int stat(const char* pathname,struct stat *buf); int lstat(const char* pathname,struct stat *buf);返回值 0 OR 1struct stat:stat简单练习: #include<stdio.h> #include<stdlib.h> #incl...
2021-08-18 15:11:13
128
原创 Linux文件IO
库IO函数的工作流程使用fopen函数打开一个文件,返回的是一个FILE *fp指针,指针指向三个重要组成成员:文件描述符:描述符中定义了文件的Inode,通过Inode可以找到对应的数据块 文件指针:读和写共享一个文件指针,读或者写都会引起文件指针的变化 文件缓冲区:减少对磁盘的读写次数。在linux中 /usr/include 文件夹中找到 stdio.h的第48行找到 typedef struct IO_FILE FILE; //FILE *p在li...
2021-08-16 10:55:36
98
原创 GDB调试
GDB(GNU Debugger)是GCC调试工具,功能强大:生成调试信息: 一般来说GDB主要用于调试 C/C++程序。在编译时,我们必须要把调试信息加到可执行文件中。gcc -g hello.c hello启动GDB启动gdb: gdb program(program:执行文件,一般在当前目录下) 设置运行参数(set args, show args) 启动程序(run 开始执行到断点处, start:程序向下执行一行)断点操作设置断...
2021-08-15 14:47:35
85
原创 makefile
1.makefile: makefile文件是用来管理项目工程文件,通过执行make命令,make就会解析并执行makefile文件。 makefile命名:makefile或者Makefile1.1makefile的基本规则#目标:依赖#(tab)命令main:main.c fun1.c fun2.c sum.c gcc -o main main.c fun1.c fun2.c sum.cmain:main.o fun...
2021-08-14 09:09:22
65
原创 共享库(shared library)/动态库
共享库在程序编译时并不会被链接到目标代码中,而是在程序运行时才载入。不同程序需要相同的库时,在内存中只需要有一份该共享库的拷贝,避免了空间浪费问题。并且在运行时才会被载入,也解决了静态库对程序的更新,部署和发布带来的麻烦共享库的制作:1. 将.c文件编译成.o文件gcc -fpic -c fun1.c fun2.c2.使用gcc将.o文件编译成库文件gcc -shared fun1.o fun2.o -o litest2.so#注意与静态库的不同 gcc -shar...
2021-08-13 16:20:53
3525
原创 静态库的制作和使用
静态库的制作: 1.将.c文件编译成.o文件gcc -C fun1.c fun2.c#生成两个文件 fun1.o fun2.o 2.使用ar命令将.o文件打包成.a文件ar rcs libtest1.a fun1.o fun2.o静态库的使用: 1.mian.c与head.h和libtest1.a在同一级目录的情况gcc -o main1 main.c -I./ -L./ -ltest12.main.c与hea...
2021-08-13 15:19:34
69
原创 第十二章动态内存
目前我们的程序只使用过静态内存或者栈内存。静态内存用来保存局部static对象,类static数据成员,以及定义在任何函数以外的变量。栈内存用来保存函数内部的非static对象。分配在静态内存或栈内存中的对象由编译器自动创建和销毁。栈对象仅在其定义的程序块运行时才存在,static对象在使用之前分配,在程序结束之前销毁。 除了静态内存和栈内存,每个程序还拥有一个内存池--堆,程序用堆来存储动态分配的对象--在程序运行时分配的对象。需要程序员控制创建和销毁。回忆一下黑马C...
2021-08-04 21:38:15
220
原创 第十一章关联容器
关联容器支持高效的查找和访问:map和set map-键值对(key-val):字典set中每个元素只包含一个关键字。set支持高效的关键字查询操作11.1使用关联容器:使用map: map<string, size_t> word_count;string word;while(cin>> word){ ++word_count[word];}for(const auto &w :word_co...
2021-07-31 19:22:11
173
原创 第3章 字符串、向量和数组
3.1 命名空间的using声明每个名字都需要独立的using声明头文件不应该包含using声明:因为头文件中的内容会拷贝到所有引用它的文件中去,如果头文件里面有某个using声明,那么每个使用了该头文件的文件就都会有这个声明,可能引发名字冲突。3.2 标准库类型string3.2.1 定义和初始化string对象//初始化string对象的方式string s1;string s2(s1);string s2=s1;string s3("value");str...
2021-07-28 08:36:14
136
原创 第2章 变量和基本类型
Python动态语言,在程序运行时检查数据类型,C++静态语言,类型检查发生在编译时。2.1基本内置类型2.2 变量 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替。2.2.2 变量声明和定义的关系 为了支持分离式编译,C++语言将声明和定义区分开来,声明(declaration)使得名字为程序所知,定义(definition)负责创建与名字关联的实体 声明不会申请存储空间,而定义会。...
2021-01-19 09:47:17
155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人