C/C++
文章平均质量分 67
贪睡的蜗牛
记性不好,那就多写博客。。。。
展开
-
shared_ptr初始化、循环引用、线程安全问题
循环引用,两个对象相互使用shared_ptr指向对方使用shared_ptr需要注意的问题。原创 2022-11-02 16:39:06 · 799 阅读 · 0 评论 -
c++新经典14—类
直接在类中实现的成员函数会被当做inline内联函数处理。能不能inline成功取决于编译器public :} };先执行父类构造函数,再执行子类构造函数。使用new分配大量内存的类时,需要移动构造函数和移动赋值运算符。不抛出异常的移动构造函数和移动赋值运算符应该加上noexcept,防止认为会调用移动构造反而调用了拷贝构造。对象移动完数据后,内部指针赋nullptr值。未提高移动构造函数和移动赋值运算符时,系统会调用拷贝构造函数和拷贝赋值运算符代替。原创 2022-09-08 21:27:25 · 620 阅读 · 0 评论 -
c++新经典—c++基本语言
命名空间是为了防止名字冲突而引入的一种机制。防止在大型项目中多个.cpp存在函数名、类名和变量名同名的问题。可以把命名空间看成一个作用域,这个命名空间里定义的函数与另外一个命名空间里定义的函数,即便同名,也互不影响。namespace 命名空间名字 {// ...... } } //这里无须分号结尾用户自定义是数据类型(关联了操作),定义的类变量称为对象,一块能存储数据并具有某种类型的内存空间。...原创 2022-08-29 20:45:45 · 2375 阅读 · 0 评论 -
STL教程10-容器共性和使用场景
比如软件历史操作记录的存储,历史记录,上一次的记录要进行先进先出的场景,比如排队购票系统,对排队者的存储可以采用 deque,支持头端的快速移除,尾端的快速添加。如果采用 vector,则头端移除时,会移动大量的数据,速度慢。比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。比如按 ID 号存储十万个用户,想要快速要通过 ID 查找对应的用户。二叉树的查找效率,这时就体现出来了。如果是 vector 容器,最坏的情原创 2022-07-02 16:30:23 · 372 阅读 · 0 评论 -
STL教程8-map
map相对于set区别,map具有键值和实值,所有元素根据键值自动排序。pair的第一元素被称为键值,第二元素被称为实值。map也是以红黑树为底层实现机制。注意上面第四种插入方式,如果没有插入访问,比如cout打印mymap[40],这时候也会插入,由于值类型是int,因此会插入0这里添加一个类定义比较类型添加元素打印元素...原创 2022-07-02 15:29:26 · 213 阅读 · 0 评论 -
STL教程7-set、pair对组和仿函数
2、set赋值操作3、set大小操作4、set插入和删除操作5、set的查找(重要)6、修改set的排序次序看下面的仿函数7、set里添加对象set添加元素需要排序,但如果直接排序,set不知道怎么排会报错,因此也需要一个仿函数需要注意的是,如果使用find,这时候应该查找比较的那个元素,比如上面用age进行比较的,那么查找的时候也是用这个age去查找,这个age就相当于键了。比如下面代码,虽然没有加入p4,但是p4里的40是已经加入的,因此可以找到二、pairpair是将2个原创 2022-06-30 14:15:37 · 563 阅读 · 0 评论 -
STL教程6-deque、stack、queue、list容器
前后两端都能插入和删除,push_front(),pop_front(),push_back(),pop_back()特点2)赋值操作assign3)swap交换内存空间4)大小操作size()、empty()、resize(n)5)插入和删除和查看数据pop_front()没有返回值二、stack容器在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(adapter),他们是对容器的再封装。stack是一种“先进后出”的结构。栈不能遍历,不支原创 2022-06-29 16:39:28 · 588 阅读 · 0 评论 -
STL教程5-STL基本概念及String和vector使用
夏日炎炎,热浪中我们迎来毕业季,这是告别,也是迈向新起点的开始,CSDN诚邀各毕业生/在校生/职场人讲述自己的毕业季故事,分享自己的经验,技术er的进击之路,等你来书写!你可以选择适合自己的对应身份从以下相关内容方向着笔,也可从自身经历出发,贴合活动主题参与投稿,文章题目自拟。提醒:在选择对应身份后,在发布作品前请把不用的内容(活动地址请保留)删掉提醒:在选择对应身份后,在发布作品前请把不用的内容(活动地址请保留)删掉STL(标准模板库),STL广义上分为:容器(container) 算法(algorith原创 2022-06-25 14:56:58 · 320 阅读 · 0 评论 -
STL教程4-输入输出流和对象序列化
标准I/O=标准输入+标准输出文件I/O=文件输入+文件输出cout是全局对象,已经和显示屏关联cerr没有缓冲区,clog有缓冲区,cin和cout也有缓冲区cin.peek();偷窥下缓冲区,并不从缓冲区拿走cin.putback()用是将前面用get或者getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针的位置cout...原创 2022-06-24 18:43:00 · 279 阅读 · 0 评论 -
STL教程3-异常机制
可以跳过直接看总结 目录1、基本异常语法2、异常向上抛,一直到顶层3、栈解旋4、异常接口声明5、抛出异常对象5、异常类型和异常变量的声明周期6、异常标准类 7、继承在异常中的应用 8、总结throw ,然后对应的try.....catch ...异常会一层一层的向上抛,如果异常抛到顶层还没有被处理,那么此时程序会使用terminate()去终止程序,c++的异常处理机制是跨函数的。所以throw很类似return,其实就是局部变量离开它的工作空间,会自动的调用析构函数在函数上声明throw只会抛出指定的数原创 2022-06-22 21:55:15 · 434 阅读 · 0 评论 -
STL教程3-类型转换static_cast、dynamic_cast、const_cast、reinterpret_cast方法
const_cast用于将const去掉或者增加,不过不是用于原来的变量强制类型转换,即使无关的指针类型,包括函数指针都可以进行类型转换1、程序员必须清楚知道要转变的变量,转换前是什么类型,转换后是什么类型,以及转换后有什么后果。2、一般情况下不建议类型转换,避免进行类型转换......原创 2022-06-20 20:44:24 · 217 阅读 · 0 评论 -
STL教程2-MyArray框架实现
能够存放任何类型数据,实现初始化,=符号重载,右值引用,内存释放1、类成员变量容量 int mCapacity;现有元素 int mSize;数据的首地址int *pAddr;2、类函数在class上面加入template< class T>3、MyArray(const MyArray& arr)4、T& operator[](int index)5、MyArray operator=(const MyArray& arr)6、void PushBack(T&& data)原创 2022-06-20 19:02:51 · 422 阅读 · 0 评论 -
STL教程-函数模板与模板编译机制与类模板
这时候如果有个long类型也要添加,而且维护成本很高,这时候可以通过模板技术来解决类型参数化,可以忽略类型为了让 编译器区分是普通函数和模板函数,需要与普通函数有点不同这两种都可以,遇到几个参数就写几个参数写下以后告诉编译器如果碰到奇怪的东西,不要大惊小怪,然后下面紧跟的函数遇到参数是用T代替下面这个是自动类型推导在调用函数前加上里面加上类型表示定义的类型1、函数模板可以像普通函数那样被重载2、c++编译器优先考虑普通函数3、如果函数模板可以产生一个更好的匹配,那么选择模板4、可以通过空模..原创 2022-06-07 14:43:49 · 400 阅读 · 0 评论 -
long long类型
long long在win32中是确实存在,长度为8个字节;定义为LONG64。记住它表示的是64位即可-----但对于不同的系统,在使用前还是测试一下为好long long是C++的64位整型的基本类型,“现任”长整型。long long占用8个字节,数据表示从int的【-2^31,2^31-1],升级到【-2^63,2^63-1】。long long是C++的正式标准,这也就意味着,该类型不会因为编译器或者开发平台的不同而有所差异,放之四海而皆准,而且与一些系统函数、类库都有很好的交互(如常原创 2022-05-31 13:18:13 · 25692 阅读 · 0 评论 -
c++ primer plus学习笔记01
简介oop(面向对象编程)oop的本质是设计并扩展自己的数据类型。泛型编程和oop一样都会使的重用代码和抽象通用概念更加简单,oop强调的是编程的数据方面 泛型强调的是对立于特定的数据类型类定义描述的是数据格式及用法,对象是根据数据格式规范创建的实体。类描述指定了可对类对象执行的所有操作,要对特定对象执行这些允许的操作,有两种方法,第一种就是函数的定义 第二种就是重新定义运算符UNIX编译和链接.c ->.o(目标代码文件)->.out(代码和库文件结合起来形原创 2022-05-31 09:57:16 · 1544 阅读 · 0 评论 -
服务端与客户端——移植到linux上
1、将client.cpp和service.cpp放到linux上出现问题,所以这里使用linux下的头文件1、通过一个宏来判断是win还是linux#ifdef _WIN32 #include<windows.h> #include<WinSock2.h>#else #include<unistd.h> //unix std 前面表示unix操作系统,后面表示正常的std #include<arpa/inet.h>#endif原创 2022-05-22 10:27:54 · 1566 阅读 · 1 评论 -
c++SOCKET升级为select模型(待完善)
上节接服务端与客户端1.2——发送结构化消息_贪睡的蜗牛的博客-CSDN博客FD_SET参考【一文搞懂】FD_SET的使用_欧恩意的博客-CSDN博客_fd_set一个long类型的数组(我们可以认为这是一个很大的字节数组),提供给select()机制使用的一种数据结构。主要功能是建立联系。其中每一个数组元素都能与任意一个打开的句柄(socket句柄、文件、命名管道、设备句柄等)建立联系。设置这种联系是“可以理解为给打开的句柄添加了一种标识(读or写or异常)的标识”...原创 2022-05-21 12:17:54 · 320 阅读 · 0 评论 -
服务端与客户端1.2——发送结构化消息
上节服务端与客户端1.1——持续处理“单个客户端”发送的请求_贪睡的蜗牛的博客-CSDN博客上节是使用字符串的形式充当的请求命令,使用getName获得名字,使用getAge获得年龄,其他命令统一用一个信息进行回复。本节将改进字符串的消息传递方式, 构建结构化的网络消息,使网络传输功能更复杂。这里我们使用结构体,一次性的将数据全部传递本节使用结构体进行传递数据一定要保证服务端和客户端(操作系统)中 数据结构字节序和大小保证一致 内存对齐(要求结构体里的变量的相对顺序...原创 2022-05-13 15:16:16 · 1010 阅读 · 0 评论 -
服务端与客户端1.1——持续处理“单个客户端”发送的请求
上接程序1.0socket基础api和服务端与客户端1.0_贪睡的蜗牛的博客-CSDN博客1、 服务端做的修改服务端原本为(1)建立socket(2)绑定端口 (3) 监听端口 (4)等待客户端链接(5)向客户端发送一条数据(6)关闭socket 第四步和第五步处于循环状态 这里向客户端发送完一条数据就会继续的监听,如果有新的客户端来请求就会覆盖原先的连接现在修改为:(1)建立socket(2)绑定端口 (3) 监听端口 (4)等待客户端链接(5)客户端发送的请求 ...原创 2022-05-12 13:29:50 · 291 阅读 · 0 评论 -
socket基础api和服务端与客户端1.0
目录socket基础api建立简易的TCP服务端和客户端网络字节序和主机字节序一、主机字节序:二、网络字节序(使用大端字节序):三、转换函数sockaddr和struct sockaddr_ininet_addr()和inet_ntoa()新型网路地址转化函数inet_pton和inet_ntopsocket方法第一个参数af第二个参数type第三个参数protocolTCP服务端和客户端服务流程服务端代码socket基...原创 2022-04-24 21:04:43 · 1286 阅读 · 0 评论 -
Visual Studio配置编译输出路径
Debug和ReleaseDebug:Debug 通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。Release:Release通常称为 发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。Debug 版本包括调试信息,所以要比 Release 版本大很多(可能大数百 K 至数M)项目管理哪些是x6原创 2022-04-24 14:39:53 · 2311 阅读 · 0 评论 -
在vscode运行c++的配置
参考windows 10上使用vscode编译运行和调试C/C++ - 知乎前提需要配置mingw,阿里云盘里有,将这个文件的64位文件目录加入到path里面原创 2022-03-01 10:26:21 · 518 阅读 · 0 评论 -
c++复习——侯捷版
c++ primereffective c++中文版STL源码剖析——侯捷在.h中进行防卫式声明,如果没有定义过它,那么就定义它。如果定义了,那么就不会进去,也就是下图框中的内容1是声明,2是对声明的定义,那么还需要提前弄个声明,那么就是0类的组成部分先有头,再有具体的内容,有些函数是直接在类里面定义,有些是在类之外定义模板(class template)简介将实部和虚部变量的类型不写死,如下图所示,T没写明具体类型,当我想具体使用的时候,我再...原创 2022-03-01 09:00:42 · 707 阅读 · 0 评论 -
c++内存管理4
原创 2022-02-27 15:04:00 · 313 阅读 · 0 评论 -
c++内存管理3: new handler、=default、=delete函数
1、new_handlernew_handler位于头文件< new >中当new无法成功申请内存,在抛出异常之前,new会调用一个系统默认或用户指定的错误处理函数,也就是这里的new_handler。我们可以通过set_new_handler来设置我们的错误处理函数。2、 =default一般地,编译器会默认为一个类生成:默认构造函数:X()拷贝拷贝构造函数:X(const X &)拷贝赋值运算符:X& operator(const X&a...原创 2022-02-27 14:37:58 · 7963 阅读 · 0 评论 -
c++内存管理2:小的内存管理
1、降低malloc()的次数虽然malloc()调用并不慢,但如果减少调用malloc()的次数总是好的,因此可以一次使用malloc申请一大块的内存,然后再切割2、降低cookie的用料一次使用malloc就要有一组cookie,如果有1000的对象要生成,那么使用一次malloc就会只有一组cookie,如果一次全部申请下来,那么这1000个仅有一组cookie也即速度和空间实现的第一个版本第一个版本由于需要指针指向下一个快的空间,因此并没有减少占用的内存第二个版.原创 2022-02-27 14:20:04 · 452 阅读 · 0 评论 -
c++内存管理1:primitives
目录c++ primitives(c++ 工具)基本用法1、使用malloc() 和free() 分配和释放512字节的内存2、使用new和delete3、调用::operator new()和::operator delete()全局函数4、分配器new 表达式delete表达式arrary new,arrary deleteplacement new分配内存的途径一般到CRT里,再往下会导致没有移植性c++ prim...原创 2022-02-27 12:09:55 · 699 阅读 · 0 评论 -
vector容器
使用vector需要包含头文件什么是vector向量是一个能够存放任意类型的动态数组。初始化一、不带参数// 定义了一个int类型的容器vector<int> v1;// 定义了一个double类型的容器vector<double> v2;容器可以使用数组方式获取它的值和赋值,但需要提前分配内存空间例子:vector<int> v1;// 不可以使用数组方式给他赋值,因为容器并没有给他分配内容空间v1[0] = 1; // 错误,因为没有分配空原创 2021-07-06 16:27:56 · 122 阅读 · 0 评论 -
c++中的auto
int a = 10; auto au_a = a;//自动类型推断,au_a为int类型 cout << typeid(au_a).name() << endl; //会输出int类型性质1、 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype2、 auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低3、与其他变量区别:1、auto声明的变量必须要初始化,...原创 2021-07-06 15:44:05 · 3471 阅读 · 0 评论 -
int a与int *a 与int&a
swap(int a,int b){交换两个值}int main(){ int a, int b; swap(a,b) }***swap(int a,int b) swap(a,b) //值传递即单向传递swap(int &a,int &b) swap(a,b) //引用传递 int&a =b; 即a是b的别名 一个人有很多名,但都是这个人//但是需要注意的是 引用传递是c++引用的如果&前面有变量声明则为引用传递,否则是取地址符 int p原创 2021-07-06 15:28:03 · 622 阅读 · 0 评论 -
explicit关键字
explicit关键字的作用就是防止类构造函数的隐式自动转换explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就 无效了.当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public:原创 2021-07-06 08:26:46 · 2337 阅读 · 0 评论 -
头文件和库文件
头文件头文件存放函数的定义没有实现,比如qt里面分为.h和.cpp, .h只是声明了一下,.cpp才是具体的实现库文件写的.cpp不想让用户看到,只是给他定义,那么就可以将.cpp编译成库文件,库文件是二进制的,在库文件里面看不到具体的代码。库文件不是独立程序,只是一个方法。将库文件链接到程序中有两种方式一种是静态链接库,第二种方法是动态链接库,两者区别是静态链接是直接加载到内存,而后者是需要的时候再导入内存。在win里面静态库文件是.lib 动态库文件是.dll在linux..原创 2021-05-16 16:53:44 · 975 阅读 · 0 评论