c++
文章平均质量分 77
小飞侠hello
这个作者很懒,什么都没留下…
展开
-
学习minio
MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。原创 2024-08-20 19:44:19 · 838 阅读 · 0 评论 -
编译aws并访问minio
这里我使用的是cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/root/software/aws/aws/install/ -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF。/// 判断存储桶及相关连接是否有效。参看https://docs.aws.amazon.com/zh_cn/sdk-for-cpp/v1/developer-guide/setup-windows.html。原创 2024-08-14 16:14:40 · 997 阅读 · 0 评论 -
cmake-gui
ZERO_CHECK是首先执行的构建目标,会检查生成出的VS项目相比CMakeLists.txt是否过期,如果过期会首先重新生成VS项目。首先,先将test.cpp编译成一个静态库,同时生成一个a.exe,再将静态库链接到a.exe内;项目源码写好之后,不同的平台,不同的编译器会根据CMakeLists.txt里的指令生成各自的项目文件,在Windows平台上,可以使用cmake-gui根据CMakeLists.txt里的指令,生成你电脑上安装好的Visual Studio项目。//test.h的内容。原创 2024-08-14 16:09:16 · 288 阅读 · 0 评论 -
c++编译、链接、构建
这样从cmake里就能看到源码编译的过程,也是上面我说的第二条,也能更好地理解编译的过程。project命令用于指定cmake工程的名称,实际上,它还可以指定cmake工程的版本号(VERSION关键字)、简短的描述(DESCRIPTION关键字)、主页URL(HOMEPAGE_URL关键字)和编译工程使用的语言(LANGUAGES关键字)在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。原创 2024-08-14 16:07:14 · 549 阅读 · 0 评论 -
C++日志系统log4cxx
(记录器),(输出源)和(布局)。可以简单理解为日志类别,要输出的地方,输出形式。Logger创建LoggerLogger是有一个String类的名字识别的,且大小写敏感。root logger是所有logger的祖先,是一直存在的, 通过Logger.getRootLogger()获得,并且不能通过名字获得。public static Logger Logger.getLogger(String name) 获得或者创建一个Logger。原创 2023-07-21 10:52:46 · 691 阅读 · 0 评论 -
vs、c++环境下开发使用com组件
COM组件是一组接口的集合,由Win32动态链接库(DLL)或可执行文件(EXE)的形式发布的可执行二进制代码组成。com是独立于语言的组件体系结构,可以用C++、Java和VB等任意一种语言编写com对象。COM组件的优点有:通过接口对功能分类;功能扩充,只需添加接口就行;可轻松实现进程间调用、分布式调用;具有封装、继承、多态的面向对象特征。COM是规范,以该规范实现的DLL可视为COM组件。原创 2023-07-06 11:15:19 · 5315 阅读 · 0 评论 -
STL源码剖解之空间配置器
当我们 new 一个对象的时候,包含两个操作,首先 operator new 分配内存,再调用构造函数构造对象内容 但我们 delete 一个对象的时候,同样先调用析构函数,再调用 operator delete 释放内存STL 将这个过程薄薄的包装了一下,实际上没优化配置器定义于 中, 中又包含 <stl_alloc.h> <stl_construct.h>内存配置由 alloc::allocate() 负责,内存释放由 alloc::deallocate() 负责 。...原创 2022-04-14 16:42:27 · 1017 阅读 · 0 评论 -
什么函数不能声明为虚函数
共有五种函数不能声明为虚函数,即普通函数(非成员函数)、构造函数、内联函数、静态函数、友元函数。首先说明两点:(1)虚函数是为了实现多态,而多态是属于动态联编,在运行时确定调用哪个函数。(2)虚函数调用时,类之间需要有公有继承+继承关系+基类指针或引用调用。(1)普通函数为啥不能是虚函数?原因:多态是依托于类的,要声明的多态的函数前提必须是虚函数。(2)构造函数为啥不能是虚函数?原因:多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不...原创 2022-03-11 15:30:37 · 3311 阅读 · 0 评论 -
C++ 常量引用用法
常量引用”其实是“对 const 的引用”的简称。因此不可以通过该引用来修改它所指向的对象的值。1)指向常量对象时,一定要使用“常量引用”,而不能是一般的引用。const int ci = 1024;const int &r1 = ci; // 正确:引用及其对应的对象都是常量int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象(2)“常量引用”可以指向一个非常量对象,但不允许用过该引用修改非常量对象的值原创 2022-03-11 09:43:38 · 1874 阅读 · 0 评论 -
C++构造函数初始化列表与赋值
C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值。初始化列表对成员变量做的事情叫做初始化,而构造函数体内对成员变量做的事情就叫做赋值了。整个构造函数的执行过程包括(初始化列表以及构造函数体内)都属于该对象初始化的过程初始化早于赋值,它是随着对象的诞生一起进行的。而赋值是在对象诞生以后又给予它一个新的值。c++在哪些情况下只能使用初始化列表而不能用赋值1-如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数)2-需要初始化const修饰的类成员原创 2022-03-09 17:59:10 · 3870 阅读 · 0 评论 -
c++ new操作符(new operator)、operator new、placement new 、operator new[] 及相对应的delete 操作符、operator delete
一.newnew operator就是new操作符,不能被重载,假如A是一个类,那么A * a=new A;实际上执行如下3个过程。(1)调用operator new分配内存,operator new (sizeof(A))(2)调用构造函数生成类对象,A::A()(3)返回相应指针事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局:...原创 2022-03-08 15:38:00 · 2288 阅读 · 0 评论 -
More Effective C++
Scott Meyers大师Effective三部曲:Effective C++、More Effective C++、Effective STL。1. 指针与引用的区别相同点:指针和引用都是让你间接引用其它对象。不同点:1.在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。在C++里,引用应被初始化。 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。2.指针与引用的另一个重要的不同是指针可以被重新赋值以指向原创 2022-03-08 09:18:40 · 4298 阅读 · 0 评论 -
c++如何让类对象只能在堆(栈)上分配空间
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 1、静态建立类对象:是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 2、动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配;第二步是调用构造函数构造对象,初始化这片原创 2022-03-07 15:26:44 · 2082 阅读 · 0 评论 -
c++ 内存泄漏
如类中包含指针成员变量,在未定义拷贝构造函数或未重载赋值运算符的情况下,编译器会调用默认的拷贝构造函数或赋值运算符,以逐个成员拷贝的方式来复制指针成员变量,使得两个对象包含指向同一内存空间的指针,那么在释放第一个对象时,析构函数释放该指针指向的内存空间,在释放第二个对象时,析构函数就会释放同一内存空间.原创 2022-03-07 14:19:15 · 436 阅读 · 0 评论 -
c++ 虚函数实现原理
对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。虚函数表指针(vptr)创建时机 vptr跟着对象走,所以对象什么时候创建出来,vptr就什么时候创建出来,也就是运行的时候。 当程序在编译期间,编译器会为构造函数中增加为vptr赋值的代码(这是编译器的行为),当程序在运行时,遇到创建对象的代码,执行对象的构造函数,那么这个构造函数里有为这个对象的vptr赋值的语句。二:虚函数表创建时机虚函数表创..原创 2022-03-07 09:51:21 · 1666 阅读 · 0 评论 -
静态链接和动态链接
静态链接是在编译链接时直接将需要的执行代码拷贝到调用处;优点在于程序在发布时不需要依赖库,可以独立执行。缺点在于程序的体积会相对较大,而且如果静态库更新之后,所有可执行文件需要重新链接;动态链接是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定代码时,在共享执行内存中寻找已经加载的动态库可执行代码,实现运行时链接;优点在于多个程序可以共享同一个动态库,节省资源;缺点在原创 2022-03-04 15:56:51 · 197 阅读 · 0 评论 -
c++ 学习
C++ 虚函数1.在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是怎样的?2.在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样?3.什么是 C++ 多态?C++ 多态的实现原理是什么?4.什么是虚函数?虚函数的实现原理是什么?5.什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?6.菱形继承(类D同时继承B和C,B和C又继承自A)体系下,虚表在各个类中的原创 2022-03-04 13:16:41 · 777 阅读 · 0 评论 -
sizeof(std::string) 的大小
std::string strrang = "abcasdfgggggg111111111111111111111111111111111"; int size4 = sizeof(std::string); int size2 = sizeof(strrang); int size3 = strrang.length();在VS2017 debug版本下,size4 =28, size2 = 28.在使用VS2015的32位debug构建中,sizeof(std::...原创 2022-03-04 11:14:32 · 1415 阅读 · 0 评论 -
c++11 function
讲std::function前首先需要了解下什么是可调用对象满足以下条件之一就可称为可调用对象:是一个函数指针是一个具有operator()成员函数的类对象(传说中的仿函数),lambda表达式是一个可被转换为函数指针的类对象是一个类成员(函数)指针bind表达式或其它函数对象而std::function就是上面这种可调用对象的封装器,可以把std::function看做一个函数对象,用于表示函数这个抽象概念。std::function的实例可以存储、复制和调用任何可调用对象原创 2022-02-23 18:04:21 · 715 阅读 · 0 评论 -
c++ final
控制力更强。如果一开始就不想派生,最开始的基类设置为非虚函数就可以了,final一般用于中途终止派生。作用是1.禁用重写使派生类重写该虚函数。class Super{ public: Supe(); virtual void SomeMethod() final;};2.禁用继承用来修饰类,让该类不能被继承.class Super final{ //......};class XiaoMi {public: XiaoMi(){}};...原创 2022-02-23 17:09:12 · 4938 阅读 · 1 评论 -
c++之指针常量和常量指针
指针常量和常量指针1.常量指针 const int *PtrConst 或者是 int const *PtrConst (即const 在*的左边)指向常量的指针,这里所说的“常量”其实在解引用时起到所谓常量的作用,并非是指向的变量就是常量,指向的变量既可以是非常量也可以是常量。总体意思是不能修改指向某变量的值。让指针指向一个常量,可以防止使用指针来修改所指向的值。1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;如:int a = 1; const in....原创 2022-02-21 13:13:31 · 4151 阅读 · 1 评论 -
c++ const 和 define
const :1.用于常量, const修饰的类型为TYPE的变量value是不可变的const TYPE ValueName = value; const int a = 1;2.常量指针和指针常量 见指针和数组、指针常量和常量指针的区别_baidu_16370559的博客-CSDN博客3.成员函数 const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。class A{…void function()const; //常成员函...原创 2022-02-18 14:46:27 · 821 阅读 · 0 评论 -
c++ friend
友元分为两种:友元函数和友元类。友元函数在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。将全局函数声明为友元的写法如下:friend 返回值类型 函数名(参数表);将其他类的成员函数声明为友元的写法如下:friend 返回值类型 其他类的类名::成员函数名(参数表);但是,不能把其他类的私有成员函数声明为友元。头文件#pragma once#include原创 2022-02-18 14:19:29 · 146 阅读 · 0 评论 -
C++中的explicit、implicit关键字
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换(即不能直接使用赋值操作符号“=”),只能显式地进行类型转换(如(类型)变量)。所以explicit关键字的作用就是防止类构造函数的隐式自动转换.如果构造函数没有关键字explicit,默认为隐式声原创 2022-02-18 11:28:31 · 591 阅读 · 0 评论 -
c++ 关键字
C++98/03 关键字ISO C++98/03关键字共63个,此处严格按标准原文排版: asm do if return typedef auto double inline short typeid bool dynamic_cast原创 2022-02-18 10:43:55 · 588 阅读 · 0 评论 -
#include 和前置声明
一.编码时,我们一般会尽量避免 include 头文件,而是采用声明 class XXX 。1.避免无必要的重编译 ( 在头文件发生变更时 ) 。 工程较大,低速机,或基础类经常变更 ( 不合理的设计吧 )2.采用声明可降低代码 (class) 之间的藕合度,这也是面向对象设计的一大原则。二.一般原则:a. 头文件中尽量少 include, 如果可以简单申明 class clsOld; 解决,那最好。减少没有必要的 include;b. 实现文件中也要尽量少 include, 不要 incl原创 2022-02-07 09:38:26 · 929 阅读 · 0 评论 -
c++ 内部类
内部类的概念如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。即说:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。只是内部类比友元类多了一点权限:可以不加类名的访问外部类中的static、枚举成员。其他的都和友元类一样。内部类可以定义在外部类的public、protected、pri原创 2022-01-27 14:12:46 · 3767 阅读 · 0 评论 -
设计模式之职责链
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。职责链模式结构的核心在于引入了一个抽象处理者。实现原理:把职责角色分开,形成一条链,关联。 职责链模式并不创建职责链,职责链的创建工作必须由系统的其他部分来完成,一般是在使用该职责链的客户端中创建职责链。在职责链模式结构图中包含如下几个角色:...原创 2022-01-26 15:36:32 · 142 阅读 · 0 评论 -
设计模式之策略模式
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。实现原理:虚函数、继承多态 及简单工厂模式 、单例模式,关联在策略模式结构图中包含如下几个角色: ● Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。...原创 2022-01-26 15:27:30 · 177 阅读 · 0 评论 -
设计模式之享元模式
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。基础概念:享元池:在逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象,这个对象可以出现在一个字符串的不同地方,相同的字符对象都指向同一个实例,在享元模式中,存储这些共享实例对象的地方称为享元池(Flywe原创 2022-01-25 10:28:51 · 221 阅读 · 0 评论 -
在C++中子类继承和调用父类的构造函数方法
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。2.如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。3.如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式.办法1:#include <iostream.h> cl..原创 2022-01-24 14:28:12 · 7658 阅读 · 0 评论 -
设计模式之代理模式
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。作用:通过引入代理对象的方式来间接访问目标对象实现原理:虚函数继承多态,关联关系代理模式包含如下三个角色: (1) Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。 (2) Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主...原创 2022-01-19 16:33:22 · 219 阅读 · 0 评论 -
设计模式之外观模式
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。解决的问题避免了系统与系统之间的高耦合度 使得复杂的子系统用法变得简单实现原理:新建一个类,再使用关联关系外观模式包含如下两个角色: (1) Facade(外观角色):在客户端可以调用它的方法...原创 2022-01-19 11:21:47 · 151 阅读 · 0 评论 -
设计模式之适配器模式
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。解决问题:原本由于接口不兼容而不能一起工作的那些类可以在一起工作。适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。因为:类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般原创 2022-01-19 10:14:55 · 552 阅读 · 0 评论 -
设计模式之建造者模式
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。实现原理:依赖倒置原则 ,虚函数多态、关联聚合组合关系具体见:面向对象设计原则_baidu_16370559的博客-CSDN博客作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。实现的方法:就是建抽象接口,子类具体化实现。● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,原创 2022-01-18 16:57:41 · 154 阅读 · 0 评论 -
设计模式之原型模式
原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。即通过请求原型对象拷贝自己来实现创建过程。解决问题:避免让客户端new 出来的构造函数进行大量的初始化工作,同时能够实现深拷贝。延伸深拷贝和浅拷贝的区别:c++ 深度拷贝和浅度拷贝_baidu_16370559的博客-CSDN博客_深度拷贝c++实现原理: 抽象基类(纯虚函数),虚函数继承多态,拷贝构造函数、依赖关系 在原型模式结构图...原创 2022-01-18 15:39:36 · 122 阅读 · 0 评论 -
设计模式之抽象工厂模式
概念:抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。解决的问题:由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产。抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。主要.原创 2022-01-17 16:37:10 · 339 阅读 · 0 评论 -
设计模式之工厂模式
概念:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。主要作用:将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。解决的问题:工厂一旦需要生产.原创 2022-01-17 15:29:23 · 436 阅读 · 0 评论 -
设计模式之简单工厂模式
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。实现原理:纯虚函数,继承,多态简单工厂只有三个要素。a.工厂实现 在编程中,工厂实现决定如何实例化产品,是实现扩展的途径..原创 2022-01-14 16:55:46 · 268 阅读 · 0 评论 -
设计模式之单例模式
所有的代码是以c++为准定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。原理:使用静态变量和静态函数。静态变量介绍见c++ static静态变量_baidu_16370559的博客-CSDN博客_c++静态变量实现过程:假如TaskManager类为需要设计的类1.为了确保TaskManager实例的唯一性,我们需要禁止类的外部直接使用new来创建对象,将TaskManager的构造函数的可见性原创 2022-01-14 16:05:06 · 529 阅读 · 0 评论