自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 gdb 调试常用命令

gdb调试常用命令

2024-04-20 23:35:12 638

原创 linux 命令之tar命令

tar(tape archive): 用于打包和解压文件。

2024-03-12 22:45:42 479

原创 linux 命令之find

命令用于在和。

2023-07-08 15:27:45 368

原创 gcc 编译的时候需要将编译的文件放在前面,编译所需要的库放在后面

当编译器进行链接时,它按照从左到右的顺序解析源文件和库文件。如果在链接过程中遇到未解析的符号,它会查找后面的库文件以解析这些符号。因此,如果依赖的库放在编译的文件之前,编译器会在尚未解析这些符号的情况下开始解析源文件,从而导致链接错误。通过将编译的文件放在前面,可以确保在解析源文件时已经解析了所有依赖的符号,从而避免了链接错误。这种顺序对于正确链接和生成可执行文件非常重要。总结起来,将编译的文件放在前面、依赖的库放在后面是为了确保正确解析和链接符号,以生成可执行文件。

2023-07-02 13:43:46 286

原创 linux中动态库和静态库

可重定位目标文件以一种特定的方式打包成一个单独的文件,并且在链接生成可执行文件时,从这个单独的文件中“拷贝”它自己需要的内容到最终的可执行文件中。这个单独的文件,称为静态库。linux中通常以.a(archive)为后缀使用:-lm : 使用用到系统中的静态库libm.alm放在main.o的前面,发生错误:必须把 -lm放在main.o的后面的原因放在最后时解析过程如下:将-lm放到main.o 前面使用反汇编查看 :_exp函数也在main二进制文件中,函数调用的时候直接调用动态

2022-08-02 23:55:40 318 1

原创 C++ STL 顺序容器的使用笔记

forward_list 没有rbegin()、rend()、crbegin()、rend()before_begin() 和cbefore_begin() 是forward_list独有的插入往头插入往尾部插入vector 不能往头插入push_back()在序列的尾部添加一个元素。push_front()在序列的头部添加一个元素。pop_back()移除容器尾部的元素。pop_front()移除容器头部的元素。emplace_front

2022-07-13 23:19:16 297

原创 继承的构造函数

继承的构造函数不能初始化派生类的成员,可以使用类内初始化,或则追加构造函数C++11 标准规定,继承构造函数与类的一些默认函数(默认构造、析构、拷贝构造函数等)一样,是隐式声明,如果一个继承构造函数不被相关代码使用,编译器不会为其产生真正的函数代码。这样比通过派生类构造函数“透传构造函数参数”来完成基类初始化的方式,总是需要定义派生类的各种构造函数更加节省目标代码空间。......

2022-07-04 20:38:47 1003

原创 C++拷贝、赋值、移动、析构、默认构造 什么时候会被默认生成delete

如果在类中,有一个没有类内初始化器的const内置类型成员,则该成员没有办法初始化(因为const内置类型变量必须由用户自己来初始化,注意:const的内置类型变量是无法默认初始化的)。因为该成员没有办法自己初始化(通过以上1的两种方式初始化),因此该类的默认构造函数定义为删除(delete)。如果在类中,有一个没有类内初始化器的const类类型成员,且其类型没有显示定义默认构造函数(导致该const类类型成员也没有办法默认初始化),因此该类的默认构造函数定义为删除(delete)。如果在类中,有一个没有类

2022-07-04 20:24:58 888

原创 C++ 类定义的顺序和成员初始化的顺序

// 未定义标识符构造函数初始化列表 初始化顺序和位置无关,初始化顺序和成员定义顺序一样

2022-06-28 23:03:36 507

原创 C++友元函数声明顺序

X类中的成员函数是Y类中的友元函数引用版本也是一样错误的顺序

2022-06-28 22:13:58 469

原创 C++ 类的声明笔记

C++ 类的声明笔记

2022-06-28 21:59:10 431

原创 linux每天一个命令(ls)

linux每天一个命令(ls)

2022-06-28 00:01:26 209

原创 C++ 为什么构造函数不可以是虚函数

从内存的角度看:虚函数对应一个虚函数表,虚函数表是存储在对象的内存空间中的。而调用虚函数使用过调用虚函数表来实现的。**如果构造函数是虚函数,那么就需要通过虚函数表来调用,但是对象是通过构造函数实例化的,在调用构造函数之前,,虚函数表内存空间还没有被创建,无法找到虚表。**所以构造函数不能是虚函数从使用的角度看:虚函数是通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。,但是构造函数是通过创建对象时自动调用的,不可能通过父类的指针或者引用去调用,所以规定构造函数不能是虚函数.一个派生类的指

2022-06-27 21:44:43 629

原创 C++ 左值引用、右值引用和指针在汇编层面的差别

C++ 左值引用、右值引用和指针在汇编层面的差别

2022-06-21 23:17:04 175

原创 linux 文件操作 文件属性 - stat,lstat,fstat

stat()/lstat()/fstat函数功能获取文件属性定义函数函数原型: int stat(const char *pathname, struct stat *buf); int lstat(const char *pathname, struct stat *buf); int fstat(int filedes, struct stat *buf);函数返回值:成功为:0失败为:-1 struct stat { dev_t

2022-05-31 00:12:16 150

原创 linux 文件操作 标准库 IO编程学习笔记

fopen函数原型FILE *fopen(const char *filename, const char *mode)filename : 文件名称mode 模式 :模式说明“r”打开一个用于读取的文件。该文件必须存在。“w”创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。“a”追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。“r+”打开一个用于更新的文

2022-05-29 17:26:44 131

原创 linux应用编程 open函数

open函数头文件#include <fcntl.h>函数原型int open(const char * pathname, int flags);int open(const char * pathname, int flags, mode_t mode);参数:pathname:文件路径flags:O_RDONLY 以只读方式打开文件O_WRONLY 以只写方式打开文件O_RDWR 以可读写方式打开文件.上述三种旗标是互斥的, 也就是不可同时使用, 但可与

2022-05-28 00:17:54 840 2

原创 linux 学习笔记 - 重定向

重定向> 输出重定向< 输入重定向>> 输出追加重定向内核当中的数据结构文件描述符表文件表项i节点dup和dup2#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);返回 : 错误返回-1,成功返回新的文件描述符功能 : 复制文件描述符当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符

2022-04-26 00:07:49 669

原创 linux 权限(suid、sgid、SBIT粘着位)

1. linux权限Linux 系统中采用三位十进制数表示权限,如0755, 0644.ABCDA - 0, 表示十进制B-用户C-组用户D-其他用户1.1 数值对应的权限0 (no excute , no write ,no read)1 excute, (no write, no read)2 write4 read1+2 = 3 write excute1+4 = 5 read excute2+4 = 6 write read1+2+4 = read w

2022-04-23 22:44:01 1219

原创 linux进程间通信 -信号量

信号量信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享由于信号量只能进行两种操作等待和发送信号,即P(sem)和V(sem)他们的行为是这样的:P(sem):如果sem的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行V(sem):如果有其他进程因等待s

2022-04-18 00:36:42 873

原创 linux进程间通信 - 共享内存(shm)

共享内存顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,

2022-04-17 23:45:59 1721 1

原创 linux 进程通信 - 消息队列

消息队列消息队列亦称报文队列,也叫做信箱。是Linux的一种通信机制,这种通信机制传递的数据具有某种结构,而不是简单的字节流。消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构向消息队列中写数据,实际上是向这个数据结构中插入一个新结点;从消息队列汇总读数据,实际上是从这个数据结构中删除一个结点消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限创建消息队列

2022-04-17 23:08:00 1386

原创 linux ftok函数的使用

ftok API#include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);ftok根据路径名,提取文件信息,再根据这些文件信息及project ID合成key,该路径可以随便设置。该路径是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。proj_id是可以根据自己的约定,随意设置。这个数字,有的称之为proj

2022-04-17 18:21:20 543

原创 C++ primer学习笔记 - 第十五章 面向对象程序设计

一、OOP:概述继承(inheritance)动态绑定(dynamic binding)静态绑定二、定义基类和派生类定义基类定义派生类类型转换和继承三、虚函数四、抽象基类五、访问控制与继承六、继承中的类作用域七、构造函数和拷贝函数虚析构函数合成拷贝控制与继承派生类的拷贝控制成员继承的构造函数...

2022-03-23 23:16:47 1010

原创 C++ primer 学习笔记- 16章(类模板)

1. 类模板1.1 实例化类模板1.2 类模板的成员函数1.3 类模板和友元1.4 类模板的static成员1.5 使用类的类型成员1.6 默认模板实参1.7 成员模板1.7.1 普通类的成员模板1.7.2 类模板的成员模板

2022-03-22 21:43:37 813

原创 C++ primer 学习笔记- 16章(函数模板)

1. 函数模板函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化存在inline 和 constexpr 函数模板1.1 实例化函数模板template <typename T> void func(T t){ cout<<t<<endl;}1.1.1 隐式实例化: func(i)在发生函数模板的调用时,不显示给出模板参数而经过参数

2022-03-21 22:10:35 729

原创 C++primer 学习笔记 -第16章 模板与泛型编程(模板)

1. 模板模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;1.1 模板类型参数模板参数通常表示类型,表示类型的模板参数称为类型模板参数(type template parameter)template<typename T,typename Container>class Grid{…}1.2 非模板类型参数整数及枚举类型指针(对象指针或函数指针)引用(对象引用或函数引用)指向类对象成员函数的指针templatetemplate<vo

2022-03-20 23:09:55 141

原创 C++primer 学习笔记 -第16章 模板与泛型编程(模板的偏特化与全特化)

1. 特化的概念模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。1.1 模板偏特化模板偏特化(Template Partitial Specialization)是模板特化的一种特殊情况,指显示指定部分模板参数而非全部模板参数,或者指定模板参数的部分特性分而非全部特性,也称为模板部分特化。与模板偏特化相对的是模板全特化,指对所有模板参数进行特化。模板全特化

2022-03-20 21:28:51 806

原创 C++primer 学习笔记 -alloctor

引言new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起。我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定知道对象应有什么值。当分配一大块内存时,我们通常计划在这块内存上按需构造对象。在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象的创建操作**(同时付出一定开销)。一般情况下,将内存分配和对象构造组合在一起可能会导致不必要

2022-03-18 22:29:59 79

原创 C++primer 学习笔记 -智能指针和动态数组

2022-03-18 21:53:22 369

原创 C++ primer 学习笔记-智能指针自定义删除器

默认情况下,智能指针使用delete释放其管理的资源,有时候,可能要修改默认使用delete释放资源的行为。本文将列出我所知道的所有自定义删除器的方法。shared_ptr使用删除器格式unique_ptr 使用删除器格式例子:Connection是一个管理连接类,在释放Connection之前,我们需要调用close函数来关闭连接。观察如下代码:class Connection {public: Connection() = default; explicit Connec

2022-03-18 20:45:06 1279

原创 C++primer学习笔记-成员访问运算符

成员访问运算符首先介绍下点运算符,用于获取类对象的一个成员。点运算符与箭头运算符之间的关系:*ptr->mem 与 (ptr).mem 等价。因为点运算符的优先级别比*运算符的优先级高,所以必须加括号....

2022-03-09 23:49:54 285

原创 C++primer学习笔记-递增表达式和递减表达式

递增表达式和递减表达式前置版本的递增运算符避免了不必要的工作,它把值加1后直接返回改变了的运算对象.后置版本需要将元素值存储下来以便返回这个未修改的内容,如果不需要修改前的值,那么后置版本的操作就是一种浪费。...

2022-03-09 23:47:19 297

原创 C++primer学习笔记-求值顺序

求值顺序大多数情况下不会指定求值顺序对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将会引发错误并产生未定义行为// << 运算符没有明确规定何时对运算对象求值int i = 0;cout<< i << " "<< ++i <<endl; // 未定义的 因为上诉程序是未定义的原因**,编译器可能先求++i的值再求i的值**,或则先求i的值然后再求++i的值,甚至编译器还可能做出完全不同的操作.因此表达式的行为不

2022-03-09 23:28:16 638

原创 C++ primer学习笔记第三章 - 字符串

string初始化string s1; // 默认初始化string s2 = s1;// 拷贝初始化string s3(s1); // 直接初始化,string s2 = s1 等价string s4(“hello string”);//直接初始化,s4 是字面值常量的副本string s5 = “hello string”;//拷贝初始化, string s4(“hello string”) 等价string s6(10, ‘c’); //初始化由连续10个字符c组成的串操作s

2022-03-09 23:09:08 109

原创 C++ primer学习笔记第三章变字符串、向量和数组-namespace

namespacenamespace是名字空间,可以防止多个文件有重复定义成员(变量,函数,类等)命名空间成员的外部定义的格式为:命名空间名::成员名 ……有名字的命名空间嵌套namespacenamespace Outer // 命名空间Outer的定义{ int i; // 命名空间Outer的成员i的内部定义 namespace Inner // 子命名空间Inner的内部定义 { void f() { i++; } // 命名空间Inner的

2022-03-07 21:40:25 260

原创 C++ primer学习笔记第三章变字符串、向量和数组-using

usingusing 声明using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域) 。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。#include <iostream>class Base {protected:

2022-03-07 21:38:16 230

原创 C++ primer学习笔记第2章变量和基本类型-decltype

decltype(类型说明符)随着程序越来越复杂,程序中用到的类型也越来越多,这种复杂性体现在两个方面。问题一: 一些类型难于“拼写”,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。解决问题一: 可以使用类型别名技术。问题二: 有时候根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文寻求帮助。解决上面两个问题可以是:解决问题二: 可以使用auto和本文的主题:decltype。用法decltype + 变量 vardecltype + 表达式 expr

2022-03-06 22:29:56 272

原创 C++ primer学习笔记第2章变量和基本类型-auto

autoauto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。时刻要注意auto并不是一个真正的类型。auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。auto和其他变量类型有明显的区别:auto声明的变量必须要初始化,否则编译器不能判断变量的类型。auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数auto的用法用于代替冗长复杂、变量使用范围专一的变量声明

2022-03-06 21:20:42 144

原创 C++ primer学习笔记第2章变量和基本类型-const限定符

const顶层const底层constconst 和 函数const 和 指针const 和 对象

2022-03-05 11:48:33 378

空空如也

空空如也

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

TA关注的人

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