自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 UML类图

从油管里看到了个视频,虽然是个广告但感觉讲UML非常清晰,推荐下:UML Class Diagram Tutorial。能翻墙的场景不是很多,自己整理下方便日后直接看笔记。UML类图基本特征类的关系继承关联聚合组合多重性假设我们要建立一个动物园系统,根据这个动物园系统来详细讲述UML相关知识基本特征  动物园中有很多动物,为了描述这些动物,我们可以建一个动物类Animal,该类的实例将是某个特定的动物。  我们可以通过属性(attributes)来确定Animal的每个实例。属性是一条重要数据,其

2021-08-07 20:02:53 796

原创 C++文件操作

文件操作基础  IO流基础中记录了IO操作,但实际编程中基本很难见到控制台上的操作,都是限量化的带有UI的输入操作。在IO流的基础上我们可以学习文件的操作,输入流的起点和输出流的终点都可以是磁盘文件。  C++中把每个文件都看成是一个有序的字节序列,每个文件都以文件结束的标志结束。不同于cin和cout的按行处理方式,文件都是按照块来存储的。按照文件中数据的组织形式可以把文件分为两种:文本文件:文件中信息形式为ASCII码文件,每个字符占一个字节;二进制文件:文件中信息的形式与其在内存中的形式相同

2021-03-07 22:54:24 320

原创 C++——IO流基础

IO基础  C++中经常使用cout和cin做输入输出,这实际上就是一种流的状态。正如生活中的流水一样,总是单维度、单方向的,从一个地方流向另外一个地方。C++中的iostream就是这种概念,从一个地方流入信息,然后以字节流的方式流向另一个地方。  传统的C语言中有printf,scanf,getch,gets等函数,他们自身具有一些缺点:1、不可编程,仅仅能识别固有的数据类型,不能输入输出自定义类型;2、代码的可移植性差。  C++中的I/O流istream和ostream等,可以编程,对于类库的

2021-02-28 23:19:41 197

原创 wmi基础

文章目录Windows管理规范wmi简介WMI攻击技术WMI防御技术Windows管理规范wmi简介  wmi就是Windows Managerment Instrumentation(Windows管理规范),是Windows中的一个核心管理技术。wmi为访问大量的Windows管理数据和方法提供了一个统一的机制。wmi通过脚本、C++程序接口、.Net类(系统管理)和命令行工具(WMIC)提供了对这个信息的访问。wmi的功能还包括事件、远程、查询、查看、计划和实施用户扩展及更多内容。可以理解为Wi

2021-01-24 16:08:51 1383

原创 Git基础知识整合

文章目录git的基础操作安装github仓库上传代码到githubgit的基础操作安装git官网找到适合自己操作系统的版本。当git安装完成后,在桌面点击右键会发现新增两个git选项,这就表示我们安装完成了。对于MAC系统来说有四个安装方法,建议使用第一个Homebrew方法安装。安装完成可以控制台输入命令查看当前git版本git --versiongithubgithub是目前全球最大的代码托管网站,我们可以把自己的项目放到github上去,让它帮助我们做代码托管。其次github也是

2020-12-15 00:55:50 98

原创 避免头文件重复包含的解决方式

工程中我们为了避免头文件被重复包含,有两种方式解决:使用宏#ifndef _SOMEFILE_H_#define _SOMEFILE_H_//我们的代码#endif使用宏来放置同一个文件被多次包含优点:可移植性好缺点:无法防止宏名重复,难以排错使用编译器#pragma once使用编译器来防止同一个文件被多次包含优点:可以防止宏名重复,易排错缺点:可移植性不好(Windows支持,其他系统就不一定了)...

2020-11-02 00:42:09 1230

原创 C++函数

文章目录函数函数重载(overload)与签名指向函数的指针和返回指针的函数函数一个C++程序是由若干个源程序文件构成,而一个源程序是由若干个函数构成。函数将一段逻辑封装起来便于复用。从用户的角度看,函数分成两种:库函数:标准函数,由C++系统提供。比如strcpy_s用户自定义函数:需要用户定义后使用函数的组成部分:返回类型:一个函数可以返回一个值;函数名称:这是函数的实际名称,函数名称和参数列表一起构成了函数签名,函数签名才是函数被调用时使用的真正的名字;参数:参数列表包含函数参

2020-10-26 23:59:20 694 2

原创 初步认识远程仓库——Github

Github的使用创建远程仓库推送本地代码到远程仓库实际开发过程中往往需要好多人一起开发,那么就会涉及到交换代码的问题。这时仅有本地仓库就不够用了,需要有个远程仓库。创建远程仓库  首先创建自己的Github账号,然后创建一个工程之后页面提示我们新建一个仓库推送本地代码到远程仓库我们有两种通信协议:SSH和HTTPS。SSH(Secure Shell)协议是目前比较可靠,专门为远程登陆会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。使用SSH协议

2020-10-25 17:57:18 137 1

原创 C++11——const_iterator

  C++中有一个原则:只要有可能,就应该使用const。const_iterator是STL中指涉到const指针的等价物,指涉到不可被修改的值。任何时候只要我们需要一个迭代器而且其指涉的内容没有必要修改,我们就应该使用const_iterator。  在C++98中,const_iterator得到的支持不够全面。建立它们不容易,而且建立好了后使用方法也受限。比如说我们想要在vector中插入数据,按照C++的原则如果我们不需要改动数值那么就把内容设置成为const,但是插入操作只能接受iterato

2020-10-20 19:47:48 1197

原创 C++三种基本结构

C++语言有三种基本结构:分支结构if分支if语句是最常用的一种分支语句,也称为条件语句。if(p != NULL){}else{}写else的时候一定要注意不要有模糊的内容,放置出现bug。if的示例1:实现一个函数:输入一个年号,判断是否是闰年//1、能否被400整除//2、能否被4整除但是不能被100整除if((year%4 == 0 && year%100 != 0) || year % 400 == 0){ return true;}el

2020-10-18 23:05:14 4880

原创 C++11关键字:override

  C++继承与派生中的一个最基本的理念是:在派生类中虚函数的实现,会改写基类中对应虚函数的实现。改写(override)和重载(overload)两个概念容易弄混,但是我们要知道,正是由于虚函数的改写,使得通过基类接口调用派生类函数成为可能。如果要让改写动作真的发生,有一系列要求必须满足:基类函数必须是虚函数;基类和派生类中(除析构外)函数名字必须相同;基类和派生类中的函数形参型别必须完全相同基类和派生类中的函数常量性必须完全相同C++11中还要求基类和派生类的引用饰词必须相同。   

2020-10-13 15:52:12 266

原创 成员函数引用饰词

  成员函数引用饰词是C++11中鲜为人知的语言特性。它们是为了实现限制成员函数仅用于左值或者右值的。带有引用饰词的成员函数不必是虚函数。class Widget{public: void doWork()&; //仅在*this是左值时调用 void doWork()&&;//仅在*this是右值时调用};Widget makeQidget(); //函数返回的是右值Widget w; //普通对象,是左值w.doWork(); //以左值调用make

2020-10-13 15:45:44 171

原创 Windows的字符和字符串

字符和字符串字符编码数据类型Windows日益流行,本地化Windows应用程序将是一大问题,其中一个核心的问题就如何处理不同字符集的问题。字符编码  很久以来我们都在使用ANSI编码来表示一个字符串,它是一个“以0结尾的单字节字符数组”。但是单个字节只能表示256个符号,难以应付世界上众多语言。  之后世界上出现了DBSC双字节字符集,一个字符串中的每个字符都由1个或2个字节组成。但是每次使用都要判断哪些是一个字节,哪些是两个字节。  1988年出台的Unicode编码很好的解决了这个问题。我们

2020-10-13 09:48:44 443

原创 C++11删除函数

优先选用删除函数,而不是private未定义函数任何函数都可以删除,包括非成员函数和模板具现  我们时常会面临这种情况,程序中我们有一些不希望外部调用的函数。虽然我们可以不声明不定义,但是对于一些自动生成的函数,比如复制构造函数和复制赋值运算符,这些函数在某些情况下也不希望外部调用。  一个例子,C++标准库中输入输出流库继承谱系基类部位的,是类模板basic_ios,所有的输入输出流都继承该类。对于输入输出流进行复制是不可取的,因为我们不知道要落实成什么样子。对于一个istream对象表示一..

2020-10-13 09:45:42 2042

原创 C++11枚举类——enum class

文章目录枚举类优势——降低命名空间污染枚举类优势——避免发生隐式转换枚举类优势——可以前置声明C++98中enum的使用情况enum现在被称为不限范围的枚举型别enum class是限定作用域枚举型别,他们仅在枚举型别内可见,且只能通过强制转换转换为其他型别。两种枚举都支持底层型别指定,enum class默认是int,enum没有默认底层型别enum可以前置声明,enum仅在指定默认底层型别的情况下才能前置声明  众所周知在C++中,变量名字仅仅在一个作用域内生效,出了大括号作用域,

2020-10-12 17:41:09 54210 4

原创 C++11——别名声明

typedef不支持模板化、但别名声明支持别名模板可以让人免写“::type”后缀,并且在模板内,对于内嵌typedef的引用经常需要加上typename前缀在程序中,我们有时候需要用到很长的型别类型,例如:“std::unique_ptr<std::unordered_map<std::string,std::string>>”。这么长的类型,以往我们会使用typedef来定义别名。但是在C++11中,新增了别名声明来替代它。//使用typedef:typedef..

2020-10-10 17:32:20 625

原创 C++11关键字——nullptr

相对于0或者NULL,优先选用nullptr避免在整型和指针型别之间重载0和NULLC++98中,程序员常常采用0或者NULL来判断指针是否为空。在C++11中,我们要采用nullptr来避免不必要的麻烦。  字面常量0的型别是int,而不是一个指针。当C++在只能使用指针的语境中发现了一个0,虽然也会勉强解释为空指针,但是这是个不得已的行为。  以上结论对NULL也成立。虽然标准允许给予NULL非int的型别(比如long),但是不论是0还是NULL,它们都不具备指针型别。  C++的..

2020-10-10 16:12:33 327

原创 C++的自定义结构——枚举、结构体、联合体

自定义结构枚举枚举我们经常使用#define和const来创建符号常量。我们可以使用枚举类型enum,它不仅可以创建符号常量,还能定义新的数据类型。//枚举的声明enum wT{Monday,Tuseday,Wednesday,Thursday,Friday,Saturday,Sunday};//定义wT weekday;要区分声明和定义,声明仅仅是告诉编译器有这个变量,只有定义后才会有实实在在的存储空间。enum wT{Monday,Tuseday,Wednesday,Thursday

2020-10-10 00:33:52 375

原创 ()和{}初始化的用法

大括号初始化可以应用的语境最为宽泛。可以避免令人苦恼的解析语法、可以阻止隐式窄化型别转换构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std::initializer_list型别的形参想匹配,即使其他重载版本更合适使用两个实参来创建std::vector<数值类型>结果会大相径庭。这是大括号与小括号之间的一个明显不同的例子我们指定初始化的方式包括使用小括号、使用等号或者使用大括号。int x(0); //使用小括号初始化int y = 0; //使用等号初始化..

2020-10-09 20:12:46 1720 1

原创 C++11——auto的使用

文章目录抛弃显式型别声明改用auto抛弃显式型别声明改用autoC++98时代,我们声明变量都是显式的://初始化变量int x;//使用迭代器的提领结果来初始化局部变量template<typename It>void dwim(It b,It e){ while(b!=e) { typename std::iterator_traits<It>::value_type currValue = *b; }}  声明int x的时候我们根本就

2020-10-09 16:51:48 590

原创 常用的智能指针

  使用指针有时候是比较危险的,可能存在空指针,野指针问题,并造成内存泄漏的问题。可是指针又非常的高效,所以我们希望以更安全的方式来使用指针:使用更安全的指针——智能指针不使用指针,使用安全的方式——引用C++中推出了四种常用的智能指针:unique_ptr、shared_ptr、weak_ptr和C++11中已经废弃的auto_ptr,auto_ptr在C++17中被正式删除。要记住,智能指针和指针一样都是栈中的变量,它们指向堆区中的内容。文章目录auto_ptrunique_ptrshar

2020-10-09 09:20:54 224

原创 资源管理方案——RAII

Resource Acquisition Is Initialization  RAII是C++所特有的资源管理方式。有少量其他语言也采用RAII,但是C++是唯一一个依赖RAII来做资源管理的。RAII依托栈和析构函数,来对所有的资源——包括堆内存在内进行管理。对于RAII的使用,使得C++不需要类似于Java那样的垃圾收集方法,也能有效的管理内存。RAII的存在,也是垃圾收集虽然理论上可以在C++中使用,但是从没有流行过的主要原因。  RAII有些比较成熟的智能指针代表,如:std::auto_p

2020-10-08 19:56:51 160

原创 程序内存分布

文章目录内存分区cpp动态分配和回收原则堆内存分区int a = 0; //(GVAR)全局初始化区int* p1; //(bss)全局未初始化区int main() //(text)代码区{ int b; //(static)栈区变量 char s[] = "abc"; //(static)栈区变量 int* p2 = NULL; //(static)栈区变量 char *p3 = "123456"; //p3在栈区,123456\0在常量区 static i

2020-10-08 19:50:51 165

原创 C++指针与引用

指针与引用指针指针  内存中有很多内存单元组成。这些内存单元用于存放各种类型的数据。为了标识内存单元,计算机对内存的每个单元都进行了编号,这个编号就称为内存地址,地址决定了内存单元在内存中的位置。程序员并不需要记住这些内存地址,C++的编译器让我们通过名字来访问这些内存位置。  指针本身就是一个变量,其符合变量定义的基本形式,它存储的值是地址。对于一个基本类型T,T是“到T的指针”类型,一个类型为T的变量能够保存一个类型T的对象的地址。  通过一个指针访问它所指向的地址的过程称为间接访问或者引用指针

2020-10-07 23:52:30 297

原创 C++11——std::function

  std::function是C++11标准库的一个模板,它把函数指针的思想加以推广。函数指针只能指涉到函数,而std::function却可以指涉到任何可以调用的对象,即任何可以像函数一样可以实施调用之物。  我们想要创建一个函数指针就必须要指定欲指涉到的函数的型别(即该指针指涉到的函数的签名),类比来看,我们想要创建一个std::function对象就必须指定欲指涉的函数的型别。这一步是通过std::function模板形参来完成的。//声明一个函数对象func,它可以指涉到任何能用以下述签名调用

2020-09-30 15:08:48 152

原创 C++型别推导

型别推导函数模板  C++中有三套型别推导规则,分别为函数模板、auto、decltype。型别推导让我们不用写那些不言自明的冗余的型别。还提高了软件的适应性,在源代码的其中一个地方对一个型别进行改动可以自动传播到其他地方。函数模板函数模板的使用如下://模板声明template<typename T>void f(ParamType param);//模板调用f(expr);编译期,编译器会通过expr来推导T的型别和param的型别。这两个型别往往是不一样的。因为Pa

2020-09-30 10:52:16 699

转载 Trailing return types尾部返回类型

文章目录为什么要有尾部返回类型什么是返回类型推导(return type deduction)不是什么时候都要使用尾部返回类型  尾部返回类型在C++中是一个很奇怪的内容,我们应该只在必要的时候使用。我们要决定采用它作为一种通用风格的时候一定要小心,并尽量的保持这种风格。  首先看下列代码:auto getMulticastHops() const -> int;这是一种声明C++11语言中函数的方法。->int部分称为尾部返回类型,这行代码和一下代码是相同的:int getMult

2020-09-29 11:41:01 300

原创 故障转储分析——用户模式

使用WinDbg进行故障转储分析——用户模式用户模式转储文件完全用户模式转储文件小型转储文件创建用户模式转储文件自动创建转储文件调试时创建转储文件分析用户态转储文件安装符号文件启动windbg分析转储文件用户模式转储文件用户模式转储文件有两类,分别是完全用户模式转储文件和小型转储文件。这两种的差异在于大小。小型转储文件更紧凑一些。需要注意虽然我们可以通过分析转储文件来获取很多信息,但是任何转储文件都不能提供与实际使用调试器直接调试故障所得到一样多的信息。完全用户模式转储文件  这个转储文件包括进程的

2020-09-27 15:54:42 552

原创 WinDbg简易操作

WinDbg基础操作用户模式调试启用记事本并附加WinDbg.exe用户模式调试启用记事本并附加WinDbg.exe打开windbg,在File菜单中选择Open executable file打开可执行文件,在对话框中导航到包含notepad.exe的文件夹,输入notepad.exe作为文件名称,选择打开。在底部的命令行中输入以下命令设置符号路径:.sympath srv*输出以下内容:符号搜索路径指示 WinDbg 查找符号 (PDB) 文件的位置。 调试器需要符号文件来获取有关代

2020-09-27 14:39:35 391

原创 Windows调试

Windbg调试WinDbg概览WinDbg概览  WinDbg是著名的Windows平台的调试器,既可以用用户态调试、也可以用内核态调试。  WinDbg架构是一个引擎,上面有多个可执行程序。虽然WinDbg是个具有GUI的调试器,但是我们很多时候还是需要输入命令进行调试。...

2020-09-24 17:43:40 331

原创 快捷方式操作

最近遇到需要创建桌面快捷方式,程序结束的时候删除快捷方式的操作,需要用COM编程。记录一下#include <shlobj.h>#include<iostream>#pragma comment(lib, "shell32.lib")inline std::wstring charToWstring(const char* szIn){ int length = MultiByteToWideChar(CP_ACP, 0, szIn, -1, NULL, 0); WC

2020-09-20 17:18:02 127

原创 Photoshop入门操作基础

入门基础界面和工具界面和工具首先要打开一张图片,点击文件➡打开,选择一张图片导入。也可以直接把图片拖入PS中。左边那一竖列就是工具栏。比如我们想要插入一行字,就可以在工具栏中找到文字工具,出现小光标,点击图片中的某一个位置就可以输入文字了。在文字工具下,上方就是文字属性栏,可以调节文字的字体和大小等等。我们常常使用的属性栏都在右边,我们可以点击上方的窗口把我们需要的属性栏调出来。常用的有导航器、画笔、字符。为了防止今后操作失误把它们删掉,我们可以在右上角的基本功能里新建工作区,存储我们现在的工作区

2020-08-25 01:01:04 341

原创 C++字符串

字符串字符串变量与常量字符串变量字符串常量ASCII码表Unicode编码字符串变量与常量字符串变量字符串是一个特殊的字符数组,以空字符\0结尾空字符\0自动添加到字符串的内部表示中在声明字符串变量的时候,要时刻记得为这个空结束符预留一个额外元素的空间:char str[11] = {“helloworld”},十个字符要留11个位置字符串常量字符串常量就是一对双引号括起来的字符序列:“helloworld”字符串中的每个元素作为一个数组元素访问字符串常量也是以\0结尾的ASCI

2020-08-23 23:10:24 140

原创 Windows错误处理

  Windows函数执行前会首先验证传递的参数,如果参数无效或者因为某些原因无法执行,失败原因会通过返回值来指出数据类型失败的值VOID不可能失败BOOL失败返回0,否则返回非0.尽量检查返回值不为FALSE,而不是是否为TRUEHANDLE函数失败通常返回NULL,某些函数失败返回INVALID_HANDLE_VALUE,否则,HANDLE将标识一个可以被操作的对象。查询文档来得知返回值PVOID调用失败返回BULL,否则PVOID将标识一个数据块的内存地

2020-08-22 15:52:21 442

原创 C++数组

基础容器序列型容器数组序列型容器数组代表内存里一组连续的同类型的存储区,可以用来把多个存储区合并成一个整体。

2020-08-16 21:26:57 137

原创 TortoiseGit的使用

乌龟使用创建本地版本库向本地仓库添加文件创建本地版本库右键,在本地创建版本库;不要选复选框,如果选中,这个目录没有本地仓库,我们无法将项目添加到本地仓库中。向本地仓库添加文件这时已经添加完成,我们可以看到文件图标出现了+号:这个添加是添加到本地的暂存区此时我们再次对文件右键,可以看到commit到master分支命令,master是主分支,一旦创建仓库就会有这个master分支此时对话框下方显示以及添加,我们要添加到本地仓库还需要在上方写日志。点击提交,文件进入本地版本库,图标

2020-08-10 20:00:44 222

原创 查看本机IP

#include<iostream>#include<winsock2.h>#include <Ws2tcpip.h>#include<vector>#pragma comment(lib,"ws2_32.lib") // 静态库bool getIP(std::vector<std::string>& vdata);int main(){ std::vector<std::string> ipStr; if

2020-08-10 16:31:47 191

原创 .git目录构成

我们在执行git init命令后就新建了一个仓库,生成了一个.git的文件夹,这个文件夹就是git最核心的内容。我们进入.git文件夹来看一看里面的内容:HEAD这个HEAD是个文本文件,可以打开:系统指出这个HEAD是个引用,这个HEAD指向我们当前工作在哪个分支上。config这里存放了配置信息,和本地仓库相关的配置信息都在这里面。refs这是个文件夹,里面有两个文件目录,分别为heads和tags。tags是标签,每当项目开发到一定程度,已经有一定成果后,我们可以打一个tag,

2020-08-08 23:00:18 206

原创 Git的撤销和删除

Git有三个分区:工作区(Working Directory):电脑中能看到的目录版本库(Rspository):工作区有一个隐藏的目录.git,这个就是git的版本库,版本库又分为两个区:暂存区(stage):执行git add后文件添加到暂存区master分支:内部有一个header,可以理解为一个指针,默认指向master分支。暂存区的文件执行git commit -m操作后文件进入master分支...

2020-08-07 18:52:35 164

原创 Git基本命令

git在工作目录上进行的修改,首先要添加到暂存区内,这是git的特色功能,区别于其他的版本控制系统。每当我们进行了一次变更之后,可以把代码放入暂存区,然后进行第二次的修改。如果发现第二次的修改之后不如第一次的好,那么暂存区的内容就可以覆盖掉第二次写的东西。暂存区的内容是可以直接变成正式版本,如果发现不合适还可以回退。创建本地仓库版本库,又叫仓库,可以简单理解为一个目录,这个目录里的所有文件都能被git管理。创建本地仓库需要一个空的文件夹,新建文件夹repository,在文件夹中新建repo1文件

2020-08-05 23:54:05 116

空空如也

空空如也

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

TA关注的人

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