自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (6)
  • 收藏
  • 关注

原创 代码编写和设计的9大原则

1、保持简单和直接原则(KISS)KISS:Keep it simple,stupid。在软件开发过程中,把简单作为主要目标,避免做一些没有必要的复杂工作。2、不需要原则(YAGNI)YAGNI:You Aren’t Gonna Need It不要写目前用不上,但将来也许需要的代码。在确定真的有必要的时候再写代码,那时再重构也来得及。3、避免复制原则(DRY)DRY:Don’t repeat yourself保证在一个系统内部,任何一个知识点都必须有一个单一的、明确的、权威的陈述。4、信息

2021-04-16 15:52:18 2247

原创 c++ push_back与emplace_back

push_back与emplace_back本节直接讨论在向容器添加数据时,插入(push_back、push_front、insert等)和置入(emplace_back)的内存性能情况,深入了解C++的内部机制。考虑下面代码:vector<string> vs;vs.push_back("abcd");push_back的两个版本:void push_back(const T& x);//左值void push_back(T&& x);//右值vs是

2021-04-15 13:51:20 1090

原创 C++2.0新特性——lambda表达式

lambda表达式一、概念1、lambda表达式:表达式的一种,是源代码的组成部分。常用于创建闭包并将其用作传递给函数的实参,例如:vector<int> vec={1,2,3};find_if(vec.begin(),vec.end(),[](int val){return 0<val && val<10;});第三个参数即为lambda表达式。2、闭包:闭包是lambda表达式创建的运行期对象,根据不同的捕获方式(按引用或值),闭包会持有数据的副本或

2021-04-14 20:10:48 374

原创 C++11新特性——右值引用、移动语义和完美转发

一、概念移动语义:使编译期使用移动操作来替换复制操作。如unique_ptr、future、thread。完美转发:使得人们可以撰写接受任意实参的函数模板,并将其转发到其他函数,目标函数会接受到与转发函数所接受的完全相同的实参。右值引用:将移动语义和完美转发胶合起来的底层语言特性。要点:函数形参总是左值,即使其类型为右值引用:void f(Widget&& w);w是个左值,即使定义为右值引用。二、move和forwardmove:无条件将实参强制转化为右值。实例实现如下:

2021-04-13 20:24:24 280

原创 C++ Pimpl习惯用法

Pimpl习惯用法Pimpl(pointer to implementation):指向实现的指针。把某类的数据成员用一个指向某实现类(或结构体)的指针替代,然后把原来在主类的数据成员放到实现类中,并通过指针间接访问这些数据成员。例如:class Gadget{};//位于头文件Gadget.h中class Widget {//位于widget.h头文件中public: Widget();private: string name; vector<double> data; G

2021-04-13 11:14:47 162

原创 C++ 2.0新特性——智能指针

智能指针一、裸指针与智能指针使用智能指针就是为了克服裸指针的一系列缺点:1、裸指针在声明中并没有指出指向的是单个对象还是一个数组。2、裸指针在声明中也没有提示在使用完指向的对象之后,是否需要析构它。即在声明中看不出指针是否拥有其指向的对象。3、即使知道指向的对象,也不可能知道怎样析构才是合适的。是调用delete还是放到专门的用于析构的函数里面。4、即使知道需要使用delete,匹配对像“delete”和数组“delete[]”也会存在未定义行为。5、上述都清除,要保证析构在所有代码路径上都执

2021-04-13 10:50:15 317

原创 C++ 2.0新特性——对象自动添加移动构造函数和移动赋值运算符

移动构造函数和移动赋值运算符一、特种函数特种函数:C++自行生成的成员函数。C++98的4个特种成员函数:默认构造函数(无参),析构函数、复制构造函数、复制赋值函数。特种函数都具有public访问层级,都是inline,非虚的。只有在类中没有声明任何对应的函数,编译期才会自动生成。class Widget {public: Widget();//默认构造函数 ~Widget(); //默认析构函数 Widget(const Widget& w); //默认复制构造函数 Wi

2021-04-09 17:28:23 482

原创 C++ 2.0新特性——关键字(nullptr、override、enum class)

C++ 2.0新特性——关键字一、nullptrnullptr不具备整型类型,实际类型为nullptr_t,可以隐式转化为所有的裸指针类型void f(int);void f(bool);void f(void*)f(0):调用f(int),而不是f(void*);f(null):可能编译无法通过,一般调用f(int)。不会调用f(void*)。f(nullptr):调用f(void*)1、相较于0或NULL,优先使用nullptr2、避免了在整型和指针之间重载,很好地区分了整型0和指

2021-04-09 16:39:59 206

原创 C++ 2.0新特性——大括号与小括号

C++ 2.0新特性——大括号与小括号变量创建区分() 和 {}1、大括号初始化可以应用的语境最为宽泛,可以阻止隐式窄化类型转换,若大括号内的表达式无法保证能够采用进行初始化的对象来表达,则代码无法编译通过。免疫C++的解析语法:任何能够解析为声明的都要解析为声明。double x,y,z;int sum1{x+y+z};//double 类型的和无法用int表达int sum2(x+y+z);int sum3=x+y+z;//都没问题,值由double隐式转化为intWidget w1

2021-04-08 16:30:03 2633

原创 C++ 2.0新特性——类型推导(auto、decltype)

C++ 2.0新特性——类型推导(auto、decltype)一、类型推导auto类型推导在大部分情况下就是模板类型推导,因此首先介绍模板类型的要点。1、在模板类型推导中,具有引用类别的实参会被当成非引用类型来处理,即引用性会被忽略。(类型为指针或引用)template<typename T>void f(const T& param)int x=10;const int cx=x;const int& rx=cx;定义3个变量x,cx,rx分别作为函数f的

2021-04-08 15:48:11 242

原创 C++设计模式——桥模式(Bridge)

桥模式由于某些类型固有的实现逻辑,使得他们有多个维度的变化。即一个抽象基类对应的子类中,有多种变化的路径。桥模式:将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。通过实例代码来理解这个解释:class Messager{public: //业务抽象维度的变化 virtual void Login(string username, string password)=0; virtual void SendMessage(string message)=0;

2021-04-01 16:46:58 394

原创 C++设计模式——装饰模式(Decorator)

装饰模式

2021-04-01 15:51:45 197

原创 C++设计模式——适配器模式(Adapter)

适配器模式由于环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象不满足的。主要应对迁移变化。适配器模式:将一个类的接口转换成客户希望的另一个接口。使得将原本由于接口不兼容而不能一起工作的那些类可以一起工作。#include<iostream>using namespace std;//目标接口class ITarget {public: virtual void process() = 0; virtual ~ITarget() {

2021-04-01 00:13:26 131

原创 C++设计模式——代理模式(Proxy)

代理模式在面向对象系统中,有些对象由于某种原因(对象的创建开销很大、某些操作需要安全控制、需要进程外的访问等)直接访问会给使用者、系统结构带来麻烦。代理模式:为其他对象提供一种代理以控制(隔离、使用接口)对这个对象的访问。#include<iostream>using namespace std;class Isubject {public: virtual void process() = 0;};//proxy的设计,实际实现会比较复杂。尤其是分布式系统class

2021-03-31 21:31:50 283

原创 C++设计模式——外观模式(Facade)

外观模式:简化外部客户程序和系统间的交互接口。即在系统内外搭建桥梁(间接)。外观模式:为了系统中的一组接口提供一个一致(稳定)的界面Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。#include<iostream>using namespace std;class A {public: void subOperation() { cout << "A Method..." << endl; }};class B

2021-03-31 21:10:07 199

原创 C++设计模式——享元模式(Flyweight)

享元模式在软件系统采用对象方案解决问题在于大量细粒度的对象会充斥整个系统。而对象也有一定的开销。享元模式:运用共享技术有效地支持大量细粒度的对象。#include<iostream>#include<string>#include<map>using namespace std;class Font {private: string key;public: Font(const string& str):key(str){} void o

2021-03-31 20:53:45 86

原创 C++设计模式——组合模式(Composite)

组合模式在软件某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性弊端。组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)#include<iostream>#include<list>#include<string>#include<algorithm>using

2021-03-31 18:39:33 138

原创 C++设计模式——解释器模式(Interpreter)

解释器模式在软件构建中,若某一特定领域的问题比较复杂,类似的结果不断重复出现,使用普通的编程方式来实现的话面临非常频繁的重复操作。解释器模式:给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。#include <iostream>#include <map>#include <stack>using namespace std;class Expression {public: virtual int

2021-03-31 18:10:32 654

原创 C++设计模式——访问器模式(Visitor)

访问器模式在软件构建中,由于需求的变化,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中添加,会给子类带来繁重的变更负担,破坏原有设计。访问器模式:表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素类的前提下定义(扩展)作用于这些元素的新操作(变化)。#include<iostream>using namespace std;class Visitor;class Element {public: virtual void accept(Vi

2021-03-31 16:35:19 382

原创 C++设计模式——命令模式(Command)

命令模式软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种紧耦合关系,在某些具体的事务中,比如需要对行为进行记录、撤销、事务等处理,这种情况下就需要解耦。命令模式:将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志、支持可撤销的操作。#include<iostream>#include<string>#include<vector>using namespace std;class Command {

2021-03-31 15:59:35 140

原创 C++设计模式——职责链模式(chain of Responsibility)

职责链模式在软件的构建中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,若显示指定,将带来发送者与接受者之间的紧耦合。职责链模式就是使多个对象都有机会处理请求,避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递请求,直到一个对象处理它为止。#include<iostream>#include<string>using namespace std;enum class RequestType{ REQ_HANDLE1,

2021-03-31 15:23:53 162

原创 C++设计模式——迭代器模式(Iterator)

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。#include<iostream>#include<string>#include<vector>using namespace std;class Iterator {public: virtual string first() = 0; virtual string next() = 0; virtual bool isDone() const = 0;

2021-03-31 14:31:57 122

原创 C++设计模式——备忘录模式(Memonto)

备忘录模式某些对象的状态在转换的过程中,可能有需要回溯到之前状态的需求。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。#include<iostream>#include<string>#include<vector>using namespace std;class Memento {//备忘录,存储原发器对象的内部状态statepublic: Memento(const string& str) :state(s

2021-03-31 13:43:20 269

原创 C++设计模式——状态模式(State)

状态模式在软件构建过程中,某些对象的状态变化会导致行为也随之变化。允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了其行为。enum NetworkState{ Network_Open, Network_Close, Network_Connect,};class NetworkProcessor{ NetworkState state;public: void Operation1(){ if (state == Netw

2021-03-30 17:47:55 224

原创 C++设计模式——中介者模式(Mediator)

中介者模式在软件构建过程中,经常出现多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到需求变更,这种引用关系会面临不断地变化(不稳定)。在这种情况下,使用一个中介对象来封装一系列的对象交互(封装变化),使得各对象不需要显式的相互依赖(编译时依赖->运行时依赖),达到松耦合的目的(管理变化)。代码如下:以租房为例(此处对象只有两个:租房者和房东)#pragma once#ifndef MEDIATOR_H#define MEDIATOR_H#include<st

2021-03-30 15:30:20 179

原创 C++设计模式——观察者模式(observer)

观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所以依赖于他的对象得到通知并被自动更新。具体代码如下:#pragma once#ifndef OBSERVER_H#define OBSERVER_H#include<vector>#include<iostream>using namespace std;class Subject;class Observer {//抽象观察者public: virtual int getState

2021-03-30 14:08:50 182

原创 C++设计模式——策略者模式(Strategy)

策略模式策略模式主要解决枚举变化的情况,转化为一系列算法类。enum TaxBase{ CN_Tax, UR_Tax, UK_Tax, FR_Tax};class SalesOrder {private: TaxBase tax;public: double CalculateTax() { if (tax == CN_Tax) { //... } else if(tax==UR_Tax){ //... } else if (tax == UK_T

2021-03-29 17:23:24 284 1

原创 C++设计模式——模板方法模式

模板方法模式主要解决父类中不稳定的方法,延迟到子类中去实现的问题。抽象类代码如下:#pragma once#ifndef TEMPLATE_H#define TEMPLATE_H#include<iostream>using namespace std;class Library {public: void Run() { step1(); if (step2()) {//支持变化,多态调用 step3(); } for (int i = 0;

2021-03-29 11:57:32 160

原创 C++设计模式——原型模式(Prototype)

原型模式类似于工厂模式,将工厂模式中的抽象工厂类和具体工厂类合并。适用于复杂对象,即需要调用拷贝构造函数,而工厂模式对于复杂的函数对象实现麻烦。简单的对象创建就可以直接用工厂。看代码:#pragma once#include<iostream>using namespace std;class ISplitter {public: virtual void split() = 0; virtual ISplitter* clone() = 0;//克隆自己来创建对象 v

2021-03-26 17:55:44 164

原创 C++设计模式——构建者模式(Build)

构建者模式主要是将一个复杂对象的构建和表示分离(类似模板方法模式)。直接上代码:#pragma once#include<iostream>#include<string>using namespace std;class House {public: virtual void setWall(const string& str) = 0; virtual void setWindow(const string& str) = 0; virtua

2021-03-26 17:22:22 1013

原创 C++设计模式——抽象工厂模式

抽象工厂模式抽象工厂模式和工厂模式不同的是:创建一系列相互依赖的对象先上代码:#pragma once#include<string>#include<iostream>using namespace std;class IDBConnection {public: virtual void ConnectionString(string& str) = 0;};class IDBCommand {public: virtual void Comman

2021-03-26 11:16:51 115

原创 C++设计模式——工厂模式

工厂模式很多博客都有工厂模式相关的理论介绍,就不照本宣科了,直接从问题出发。看代码:#pragma once#include<cmath>const double PI = acos(-1.0);class IGraph {public: virtual double Area() = 0;//计算图形的面积 virtual ~IGraph() {};};class Square :public IGraph {//正方形public: Square(double Sq

2021-03-26 09:24:47 105

原创 C++设计模式——单例模式

单例模式类的定义:class Singleton{private: Singleton(); Singleton(const Singleton& other);public: static Singleton* getInstance(); static Singleton* m_instance;};Singleton* Singleton::m_instance=nullptr;要点:1、无参数和有参数的构造函数私有化(防止系统自动生成或者用户

2021-03-23 16:52:39 144 1

原创 C++实现简单string类

#C++实现简单string类1、string.h#pragma once#ifndef __MYSTRING__#define __MYSTRING__#include<iostream>using namespace std;//类中带有指针必须有拷贝构造和拷贝赋值,默认的只改变指针指向,造成内存泄漏(浅拷贝)class String {public: String(const char* cstr = 0);//构造函数 String(const String&a

2021-03-10 15:50:18 207

原创 C++复数模板类的设计

C++复数模板类的设计1、Complex.h的设计#pragma once#ifndef __COMPLEX__#define __COMPLEX__#include<cmath>#include<iostream>#include <ostream>using namespace std;//所有成员函数带有this参数,指向调用者template<typename T>class complex {public: comp

2021-03-10 13:58:54 725

原创 C++常用编译警告类型和解决方法

C++常用编译警告类型和解决方法1、未使用的函数参数unused function parameter检查函数的参数在函数体内是否被使用,如果参数不需要,直接删除参数名。2、未使用的变量Variable defined but never used检查某个变量是否需要被引用,若不需要则可以通过插入一个变量本身的求值表达式解决。void Fun(){ int a; a;//消除警告}3、变量使用前未初始化Variable may be used without being ini

2021-03-04 16:54:29 1939 1

原创 go 入门实现简单的B/S网络通信

go语言实现网络编程在net包中,该包提供编写一个网络客户端或者服务器程序的基本组件,不论是TCP/UDP,或者Socket。本文介绍在windows操作系统的JetBrains Goland编辑器上实现客户端/服务端通信。步骤1、服务端。创建一个project,然后新建一个go文件,代码如下:package mainimport ( "net" "log" "io" "time")func main() { //建立TCP连接,端口号8000

2020-07-23 16:14:37 610

原创 go sort排序使用

go语言中提供了sort包执行排序的相关操作,但并不像Python那样可以直接用“.”符号调用sort()函数。1、直接调用。go中提供了三种类型数据的排序int64 float64 stringx := []int{4, 2, 7, 4, 12, 4, 2}fmt.Println(x)fmt.Println(sort.IntsAreSorted(x))sort.Ints(x)//默认升序fmt.Println(sort.IntsAreSorted(x))fmt.Println(x)

2020-07-23 14:38:48 1053

增量差异更新bsdiff的源代码.rar

增量差异更新bsdiff的源代码.rar

2021-11-02

输出给定文件夹下代码文件的总行数

统计工程文件夹代码一共有多少行

2021-11-02

虚拟串口工具exe文件.rar

虚拟串口工具

2021-09-06

自定义cppcheck.rar

书写自己的CPPcheck规则

2021-09-06

C++设计模式实例代码.rar

每个设计模式代码均能运行完成,也有对应的博客。

2021-04-01

空空如也

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

TA关注的人

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