学习C++之路
阳光下的我们2019
这个作者很懒,什么都没留下…
展开
-
c++ 转换函数 convert function
学习侯捷老师视频,做了如下测试code#include<iostream>#include<vector>#include<string>//#include<Windows.h>using namespace std;class fra { public: fra(int i,int j ) :m_i(i),m_j(j) { } operator double() const { return (do原创 2021-09-12 21:56:37 · 734 阅读 · 0 评论 -
macro for ## #
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够。我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preproce原创 2021-09-12 21:50:07 · 208 阅读 · 0 评论 -
c++模式设置之命令模式和迭代器模式
命令模式:将要执行的命令封装成一个对象,可以使用多个对象对应多个命令,对于请求排队和记录请求日志,以及支持可撤销的操作。实际是将每个command封装起来,变成一个class中的member function,利用虚函数 可以实现运行时绑定,但是会牺牲性能。函数对象的范式编程也可以做到,实现编译时绑定,性能更高。迭代器模式:类似STL中的迭代器设计思路,将算法和容器用迭代器连接。该模式定义:提供一种方法顺序访问容器的对象,又不能暴露容器的内部表示,改变其内容。STL 中的迭代器.原创 2021-04-01 19:55:48 · 116 阅读 · 0 评论 -
学习c++新特性(五)正则表达式/并发并行
头文件 <regex>原创 2020-12-24 09:53:56 · 140 阅读 · 0 评论 -
学习C++新特性(四)智能指针与内存管理
shared_ptr make_shared<T> 分配创建传入参数的对象,get() 获取原始指针 reset() 减少一个引用计数,use_count()查看引用计数 auto it = make_shared<int> (19); //声明一个it的对象 cout << *it<<" "<<it.use_count()<<endl; //19 1 计数内容 shared_ptr<int&g..原创 2020-12-23 17:23:41 · 153 阅读 · 0 评论 -
学习C++新特性(三) (容器)
线性容器 std::array 大小固定,可以与c兼容 &arr[0],有如size()、sort()函数 std::forward_list 列表容器 单向链表实现,常数复杂度插入无序容器 内部通过Hash表实现,插入和搜索元素的平均复杂度为常数 std::unordered_map/std::unordered_multiset unordered_set /unordered_multiset元组 make_tuple<T,U,...>...原创 2020-12-23 16:07:57 · 235 阅读 · 0 评论 -
学习C++新特性(二)
1、右值引用c++11之前,左值:表达式之后还持久存在的对象;右值:表达式结束后不存在的临时对象;c++11之后右值分纯右值、将亡值;纯右值:纯粹的字面量(如 10,true)或者求值结果相当于字面量或匿名临时对象。(字符串字面量只有在类中是右值,在普通函数中是左值)。将亡值:即将被销毁却能移动的值。右值引用:T && 将临时对象传递给变量,使得将亡值延续。使用move可以将左值改为右值引用 string s1="this is "; //.原创 2020-12-21 17:52:28 · 194 阅读 · 0 评论 -
学习C++新特性(一)
1、禁止类的复制。boost下的做法是 是将拷贝构造函数和赋值操作符设置为private;新特性下 可以用delete关键字来实现。class father{ public: father() { cout<< "father()"<<endl; } father( father& f) = delete; father& operator= ( const father& ) = delete;};2、枚举的原创 2020-12-17 10:47:58 · 161 阅读 · 0 评论 -
boost 安装
主要是linux的安装1、从GitHub上下载的代码https://github.com/boostorg/boost.git2、进入boost 执行 ./bootstrap.sh 生成 可执行程序b23、运行 ./b2 install (非root用户要加sudo )原创 2020-12-12 16:30:39 · 397 阅读 · 0 评论 -
bison&flex
bison和flex是开源的文本解析器,使用时paser.y写的具体遇到符合的字符怎么做,可以引入c++的类,对象,进行判断parse.l 写的是遇到的关键字和正则匹配,诸如解析时的细节。编译时 调用flex 和 bison命令 分别编译.l文件和.y文件,生成对应的cpp文件再在调用这些解析函数的代码cpp文件中调用该解析函数,入参一般是**in 前缀取决于.y的文件名。先写到这 后续再补...原创 2020-12-09 19:55:09 · 261 阅读 · 0 评论 -
看《重构-设计模式》第十二章 大型重构
1.梳理并分解继承体系 当某个继承系统承担两项责任时,建立两个继承体系,并通过委托关系让其中一个调用另一个。2.将过程化设计转化为对象设计 当代码有传统过程化风格,将数据记录变成对象,将大块的行为变成小块,并将行为移到相关对象之中3. 将领域和表述/显示 分离 某些GUI类包含了领域逻辑,改法:将领域逻辑分离开建立独立的领域类4.提炼继承系统 对于前期的大部分工作可以修改为一个子...原创 2019-09-12 13:05:45 · 176 阅读 · 0 评论 -
看《重构-设计模式》第十一章 处理概括关系
1. 字段上移 两个子类都有相同字段时,将字段移到超类中2. 函数上移 各个子类都有相同的函数,将该函数移到超类中3.构造函数本体上移 各个子类中的构造函数本体几乎一致,可以改为在超类中新建一个构造函数,在子类的构造函数中调用它4.函数下移 超类中的某个函数只与部分子类有关,将这个函数移到相关的子类中5.字段下移6.提炼子类 将类的某些特性只被某些实例用到的,放在一个新...原创 2019-09-11 12:54:25 · 140 阅读 · 0 评论 -
看《重构-设计模式》第九章 简化条件表达式 第十章 简化函数调用
9.1 分解条件表达式 从if else then 中提取单独函数 降低复杂度9.2 合并条件表达式 对于相同测试结果的条件进行合并9.3 合并重复的条件片段9.4 移除控制标记9.5 以卫语句取代嵌套条件表达式 当函数中的条件逻辑难懂时,封装函数来判断条件9.6 以多态取代条件表达式 当条件表达式根据对象类型不同而有不同行为时,将这个条件表达式放在一个子类内的覆写函...原创 2019-09-10 13:01:56 · 152 阅读 · 0 评论 -
看《重构-设计模式》第八章 重新组织数据
8.1 自封装字段 为字段建立取值和设值函数,类似get_val(),set_val;8.2 以对象取代数据值 将一些有关联的字段放在一个类或者结构体里 便于管理8.3 将值对象改为引用对象 根据对象是否可变,大小来决定8.4 将引用对象改为值对象 同上8.5 以对象取代数组 当数组中的元素代表不同的东西,选择用一个对象来取代8.6 复制“被监视数据” 当有些数据在GUI...原创 2019-09-09 13:01:53 · 244 阅读 · 0 评论 -
看《重构-设计模式》第七章 在对象之间搬移特性
7.1搬移函数 如果一个类有太多的行动,或者如果一个类与另一个类有太多合作而形成高度耦合。做法:找到使用另一个对象的次数比使用自己所在类的对象的次数还多的函数,将其调用的字段和函数放在另一个类中。7.2 搬移字段 某个字段被所驻类之类的对象使用更多,则将该字段移到其他调用类中 7.3 提炼类 对太复杂的类,负责太多,将其分离,子类化。 7.4 将类内联化 将类中的成员移到其他类,删除该...原创 2019-09-05 12:58:57 · 167 阅读 · 1 评论 -
看《重构-设计模式》第五章 重构列表和第六章 重新组织函数
第五章:重构的记录格式:名称、简短概要、动机、做法、范例寻找引用点:找到对于某个函数、某个字段或某个类的所有引用点,可以通过删除引用点,让编译器帮助找到被悬挂的引用点;这些重构手法有多成熟:基本技巧:小步前进,频繁测试,这些重构手法都是基于单进程软件的。第六章:处理过长函数:提取函数出来,注意局部变量6.1提炼函数 函数粒度变小,复用性变强;高层函数可读性变强;函数的复...原创 2019-09-03 12:45:25 · 136 阅读 · 0 评论 -
看《重构-设计模式》第四章 构建测试体系
自测试代码的价值:确保所有测试都完全自动化,让他们检查自己的测试结果一套测试就是一个强大的bug侦测器,能够大大缩减查找bug所需要的时间。JUnit测试框架:频繁地运行测试,每次编译请把测试也考虑进来--每天至少执行每个测试一次单元测试和功能测试:功能测试:属于黑盒测试,从客户角度,保证软件可用。当功能测试暴露一个bug时,除了修改错误,还要增加单元测试来暴露这个bug。编写为臻...原创 2019-08-22 19:25:34 · 140 阅读 · 0 评论 -
看《重构-设计模式》第三章 代码的坏味道
没有特别精确的衡量标准,只能有类似的迹象重复代码:同一个类的两个函数含有相同的表达式。两个互为兄弟的子类内含有相同的表达式。过长函数:找到能提取为子函数的方法之一是找到注释过大的类:分割为子类,可以先根据调用该类的接口进行分割过长参数列:通过对象来传递一些参数发散式变化:某个类因为不同的原因在不同的方向上发生变化,这时候可能需要分割该类了散弹式变化:遇到变化要在不同...原创 2019-08-20 18:59:59 · 192 阅读 · 0 评论 -
看《重构-设计模式》第二章 重构原则
何为重构:作为名词: 对软件内部结构的一种调整,目的是在不改变软件可观察的行为的前提下,提高其可理解性,降低其修改成本。 作为动词:使用一系列重构手法,在不改变软件可观察的行为的前提下, 调整其结构。为何重构:重构改进软件设计 重构使软件更容易理解 重构帮助找到bug 重构提供编程速度何时重构:三次法则:事不过三,三则重构添加功能时重构修改错误时重构复审代码时...原创 2019-08-16 12:48:02 · 193 阅读 · 0 评论 -
四种接口隔离模式
接口隔离模式主要有四种:proxy facade adapter mediator;代理、门面、适配器、中介者。proxy:为了解决两个类之间的交互,间接增加一个类用来处理之间的交互,如外部接口直接访问数据库,防止数据库接收到大量数据库导致瘫痪,增加代理类,控制对数据库的访问。facade:用来将一些耦合的类聚集起来,统一使用一个类与外界交互。adapter:适用于旧的接口与新接口进...原创 2019-08-14 21:03:35 · 285 阅读 · 0 评论 -
看《重构-设计模式》第一章
重构:当你想为程序加上一个特性,发现很难加上时,就先重构该程序。重构之前要保证有一套可靠的测试机制,有自我检验能力。重构的步伐就是以微小的步伐修改程序,即使犯错也很容易发现。注意程序中的命名规范:任何傻瓜都能写出计算机理解的程序,写出人类容易理解的程序才是优秀考虑去除临时变量,大量的临时变量会使函数变得长运用多态替换多次判断(if else 或 switch)涉及重构手法:...原创 2019-08-14 20:56:06 · 96 阅读 · 0 评论 -
学习c++设计模式--模式简介
好的程序应该是有复用的,代码中会有稳定的结构,变化的结构;对于设计模式来说,就是将变化的模块与稳定的模块设计成相应的模板。模式设计的原则有以下的:单一职责原则类的职责要单一,一个类实现一种功能。引起类的修改只有一种原因,这样降低复杂度开放-封闭原则软件实体(类、函数、模版等)可以扩展,不可以修改。对程序中频繁变化的部分作出抽象依赖倒置原则高层模块不应该依赖底层模块,抽...原创 2019-08-07 14:18:24 · 156 阅读 · 0 评论 -
学习socket编程--运输层 tcp udp stcp
udp 全称 user datagram protocol 用户数据报协议 简单 不可靠 无连接的协议 UDP 将消息封装到数据报,再封到IP数据包,然后发送到目的地。tcp transmission control protocol 传输控制协议 三次握手建立连接,四次握手关闭连接 其中time_wait 状态是为了实现tcp双全工连接终止(即处理最终那个ACK丢失的情形),并允许老的重复分节从网络消逝;tcp传输:建立连接->传输数据->释放连接;连接会计算往返时间 rtt...原创 2020-05-26 19:55:55 · 312 阅读 · 0 评论 -
初学socket编程
做项目经查遇到socket(套接字)的地方,业务的地方大部分直接调用接口,读取到内容后再返回给接口就ok了,但学习要深究其原理,因此决定学习下socket相关的内容,该文章参考了下面这位大佬的文章,不做搬运工,写下自己的理解;https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html#!commentslinux上通信和通信协议TCP中的三次握手没有直接联系,学习学的三次握手和四次握手释放都是很底层的东西,linux编程提供了sock原创 2020-05-25 20:35:29 · 367 阅读 · 0 评论 -
c++程序常见core处理--2020-09-07
首先遇到core文件,一般会采用gdb+进程执行命令+core名称(遇到core文件带单引号的可以用\转义下)。定位到core的代码行数,一般分两种情况:1、代码是自己业务代码行。这种情况下一般情况比较容易解决,大部分为:1、对空指针操作;不管别的模块是否判断指针,对指针操作前一定要先判空。2、数组溢出;要注意取值范围,常见的是字符串的问题。3、类析构时出现;当进程是通过调用共享库编译出的库时,如果某个库...原创 2020-09-07 11:45:10 · 1355 阅读 · 0 评论 -
多线程总结-2020-09-07
头文件 <mutex>std::mutexlock()、unlock() 需要在离开函数的地方解锁std::lock_guard() 实现互斥元RAII 不要把受保护的数据引用或指针传递到锁的范围之外。举例:stack<vector<typename>> 中进行出栈并复制出栈的值 操作 先复制要出栈的元素,再调用pop()函数删除出栈元素可能出现的问题:pop函数删除了 但是 元素太大未能复制成功导致失败解决:1、在pop()传入要引用的对象作为引用...原创 2020-09-07 11:43:49 · 126 阅读 · 0 评论 -
函数模版类模版和偏特化泛化的总结
最近在看侯捷的STL源码解析,遇到了一些模版的概念,先做以下总结,以备日后遗忘可查看。模版分函数模版、类模版和成员模版。源码中主要关于前两种,因此第三种先不做阐述。类模版形式:template <typename T>class FOO{ public: T get_num(); void set_num(T t1);...原创 2019-10-26 11:51:19 · 295 阅读 · 0 评论 -
数据结构-图简介
图分有向图和无向图有向图 表示节点之间有连接方向,带有箭头有向图分为生成树(连接节点之间用最少的边),连通图(每个两个节点都可以连接起来),完全图(每个两个节点都可以直接连接),应用:最小生成树图的存储结构:1 邻接矩阵 2 邻接表 3 十字链表 4 邻接多重表图的遍历:深度优先搜索 :通过递归调用,不断去调用广度优先搜索 除了第一层 余下每一层调用中将相应的...原创 2018-09-01 16:02:16 · 591 阅读 · 0 评论 -
c++ 类的多继承
子类继承多个父类,执行顺序按声明的时候进行如 class base{}class a: pubilc baseclass b :public baseclass c:public a,public bc进行初始化时,首先调用a的构造函数,因为a继承base,所以先调用的base的构造函数,顺序如下:c初始化:先调用base的构造函数,a的构造函数,再调用base的构造函数,...原创 2018-08-12 09:23:09 · 2154 阅读 · 0 评论 -
c++ 运算符重载
格式: typename operator 运算符 (typename arg,...)不能对五类运算符进行重载:.成员访问运算符 .* 成员指针访问运算符 siezeof 尺寸运算符 ?:条件运算符 ::域运算符一些规则: 重载不能改变运算符运算对象(操作数)个数。 重载不能改变运算符的优先级别。 重载不能改变运算符的结合性。 重载运算符的函数不...原创 2018-08-11 16:01:22 · 102 阅读 · 0 评论 -
c++ 多态的实现
多态是指同一名字的函数调用时根据对象的不同使用不同的实现,程序在执行中寻找相应的函数地址进行执行,也叫动态绑定。父类调用子类函数时,父类指针有多种形态。多态的实现是靠指针和虚函数,本质是虚表和虚指针;在父类的函数声明为虚函数后,其派生类的该函数都是虚函数,不需要再显示声明了;在创建类的对象时,会为每个对象提供一个虚表指针,指向该对象所属类的虚表;虚表的创建和虚表指针的初始化在类的对...原创 2018-08-11 15:25:15 · 163 阅读 · 0 评论 -
c++ 静态方法和静态属性
c++中类的对象有其相应的方法和属性,类本身也有其对象和方法,称为静态方法和静态属性。在类声明时,在类的属性前加上 static 表示该属性属于类共有的。如class classname{public:static int get_Num();private :static int classnum;}classnum属于类classname的静态属性,get_...原创 2018-08-11 13:16:23 · 2262 阅读 · 2 评论 -
c++的构造函数和析构函数
首先是构造函数,形式上,其名字与类的名称一样,永远没有返回值,声明是不需要加任何返回类型,包括void也不需要加。调用时,在创建该类实例时会最先被调用;需要先在类的声明中进行声明,之后进行定义;如//声明class classname{ classname(void);};//定义classname::classname(void){ //函数定义}销...原创 2018-08-11 12:37:08 · 118 阅读 · 0 评论 -
c++ 友元 friend class
由于存在pubic、protect和private的声明后,类的一些属性访问权限受到限制,其中public表示可以被所有类访问,protect表示只能被该类和该类的子类访问private表示只能被该类本身的函数调用在某个类的声明后面加上 friend class classname,那就表示该类可以被名字为classname的类访问该类的所有属性,包括public、protect和...原创 2018-08-11 12:21:02 · 198 阅读 · 0 评论 -
c++之联合union
union 是特殊的类,所占空间为包含的数据中最大的所占的空间,所有成员都是同一内存地址开始存储,同一时刻只能给一个成员赋值。union可以通过访问控制符来访问,.或者->,其成员可以被声明为public private protect,但不能有静态数据成员,引用成员。可以为union 定义成员函数,包括构造函数和析构函数。使用union时,由于一次只能给一个成员赋值,因此存在...原创 2018-09-10 20:08:49 · 225 阅读 · 0 评论 -
STL-模板类型
利用template 创建函数模板,如template <typename T>T func_name(T agr1,Targ2) { //do sth} 模板定义以关键字 template 开始,后接 模板形参表,模板形参表是用尖括号括住的一个或多个 模板形参的列表,形参之间以逗号分隔。创建类模板:类模板必须以关键字 template 开头,后...原创 2018-09-19 17:45:35 · 129 阅读 · 0 评论 -
stl-记录
顺序容器:vector list deque包含头文件<vector>,<list>,<deque>算法头文件<algorithm>算法 sort(a.begin(),a.end())按照从小到大查找find查找 find_first_of 查找两对迭代器范围内相同的元素,返回第一个查找到的元素写入fill(v.beg,...原创 2018-09-28 17:58:07 · 110 阅读 · 0 评论 -
迭代器代码实现对输入的字符串个数统计
#include <algorithm>#include <vector> #include <iostream>using namespace std; bool isShorter(const string &s1, const string &s2){return s1.size() < s2.size();}//...原创 2018-09-30 14:25:40 · 233 阅读 · 0 评论 -
c++代码--取硬币数最小
#include <iostream>#include <string>#include<limits>using namespace std; typedef struct { int ncoin; //使用的硬币数量 int addcoin; //从上一个状态到当前状态所用 int lasttotal; ...原创 2018-10-25 15:16:40 · 887 阅读 · 0 评论 -
c++ 读陈黎娟的《C、C++实践进阶之道,写给程序员的编程书》所感--关于变量的类型与引用
最近在看陈黎娟的书《C、C++实践进阶之道,写给程序员的编程书》,其中第十一章讲的是变量和类型,现做笔记如下:数据存储区域分只读数据区(存储常量和恒值,正常情况下不做修改)、全局/静态存储区(全局变量和静态变量)、自由存储区(CRT即c运行时库通过malloc、free函数管理的内存)、栈区(编译器自动分配和回收,存储函数的入参和局部变量)、堆区(new和delete负责的区域) 计算机存储...原创 2019-07-18 13:57:45 · 416 阅读 · 0 评论