c++
文章平均质量分 73
主要是积累相关C++领域性知识, 可能后期会包括std, boost等相关领域性知识点, 以及用C++实现设计模式, 更好的理解C++
道阻且长,行则降至
文案太难, 本人很懒
展开
-
二进制兼容
二进制兼容(Binary Compatibility)是一个软件工程中的概念,它指的是在软件组件(如库、框架或操作系统服务)的更新过程中,新版本的组件能够与旧版本保持一定程度的互换性,即不需要重新编译那些依赖于该组件的应用程序或其它库,就能保证这些程序或库正常运行并发挥预期功能。举个例子:提供了一个dll的exe使用,突然改变了一下这个dll,这时如果exe不重新编译,使用新的dll也不会出问题,那么就可以说这个dll是二进制兼容的。原创 2024-06-11 20:14:09 · 859 阅读 · 0 评论 -
_cdecl 与 _stdcal 区别 以及 extern “c‘ 作用
因为GetProcAddress仅是操作系统相关,可能会操作各种各样的编译器产生的dll,它的参数里的函数名是原原本本的函数名,没有任何修饰,所以一般情况下需要确保dll’里的函数名是原始的函数名。因为如果不用_declspec(dllimport)来说明该函数是从dll导入的,那么编译器就不知道这个函数到底在哪里,生成的exe里会有一个call XX的指令,这个XX是一个常数地址,XX地址处是一个jmp dword ptr[XXXX]的指令,跳转到该函数的函数体处,显然这样就无缘无故多了一次中间的跳转。原创 2023-11-11 18:58:48 · 263 阅读 · 0 评论 -
C++因使用模板导致出现无法解析的外部符号
我们知道一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件。不同的cpp文件是分开编译的。在函数模板所包含的cpp文件中,如果没有对此模板进行实例化的过程,所编译的obj文件没有对类模板进行实例化,主函数的cpp文件也不会对此类模板进行实例化。在编译过程只有在同一个cpp文件及其include的文件中有引用函数模板的过程,函数模板才会转化成对应的函数。原创 2023-01-18 18:55:58 · 419 阅读 · 0 评论 -
windows避免程序休眠
若要禁用离开模式,应用程序使用 ES_CONTINUOUS 调用 SetThreadExecutionState 并清除ES_AWAYMODE_REQUIRED。若要在电源托管计算机上正确运行,传真服务器、应答计算机、备份代理和网络管理应用程序等应用程序在处理事件时必须使用 ES_SYSTEM_REQUIRED 和 ES_CONTINUOUS。多媒体应用程序(如视频播放器和演示文稿应用程序)在长时间显示视频时必须使用 ES_DISPLAY_REQUIRED ,而无需用户输入。原创 2023-01-14 17:18:15 · 935 阅读 · 0 评论 -
趣聊无法为处于不同线程中父类创建子类
由运行结果看出 thread2(ThreadTest2)属于主线程(QThread(0x2675852480)),我们尝试在 QThread(0x8d9d4ff7a8)线程中为属于(QThread(0x2675852480))的 thread2 对象创建子对象。按字面意思可以理解为: 不能为属于不同线程的父对象创建子对象。也就是当前线程与父对象属于的线程不是同一个线程, 我们不能为此创建该子类。初次见到, 我们为此经常感到头疼。在类中如下声明子对象成员时。原创 2022-12-30 14:22:32 · 264 阅读 · 0 评论 -
C++11之引用
最直观理解方法:绑定到右值的引用,哪怕右值是一个临时变量, 只不过让其生命周期变长而已,但是它本身却不能绑定任何左值。原创 2022-12-10 15:56:47 · 578 阅读 · 0 评论 -
由编译器编译参数引起扩展整理
msvc cl 编译参数了解原创 2022-06-12 15:06:23 · 211 阅读 · 0 评论 -
C语言中常见的容易模糊概念
目的主要是讲解C语言中容易混淆术语概念, 指针数组, 数组指针, 指针函数, 函数指针,指针常量, 常量指针。如果不常用 我偶尔也会忘记, 所以想朝花夕拾, 偶尔能够翻来看看, 说不定还能达到温故而知新。概念解释名词名词解释指针常量本质是一个常量,只不过这个常量是指针类型常量指针本质是一个指针,只不过这个指针是指向常量函数指针本质是一个指针,只不过这个指针指向函数指针函数本质是一个函数,只不过返回指针类型数组指针本质上是一个指针,只不过该指针指向数原创 2022-05-05 21:50:41 · 142 阅读 · 0 评论 -
c++11 constexpr
目的了解constexpr作用constexpr变量C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。constexpr函数constexpr函数是指能用于常量表达式的函数。 应遵循的约定:函数返回类型及所有形参的类型都是字面值类型,而且函数体中必须有且只有一条return 语句。constexpr函数体内可以有其他语句,只要这些语句在运行时不执行任何操作。原创 2022-05-04 21:57:50 · 234 阅读 · 0 评论 -
缺省比较(三路比较运算符 <=>)
三路比较运算符<=> 三路比较运算符缺省比较对于如下运算符:<、<=、>=、>, 如果<=>没有被定义,则这些运算符的默认实现即是将它们声明为deleted;否则,这些运算符将通过调用并判断<=>的返回值以确定两个操作数的大小关系。对于!=运算符:如果没有被定义,则!=的默认实现即是将它声明为deleted;否则,!=的默认实现将调用并将其返回值逻辑求反作为!=的返回值。三路比较运算符基于该运算符可以生成其他常用运算符,但它没有为我们提原创 2022-04-10 22:49:06 · 1012 阅读 · 0 评论 -
C++模式之代理模式
目的给某个对象提供一代理,通过代理对象去控制对原对象的引用。角色Subject(抽象主题角色)真实主题与代理主题的基类,使得任何使用真实主题的地方都可以使用代理主题。RealSubject(真实主题)定义了代理角色所代表的真实对象,实现了真实的业务逻辑操作。ProxySubject(代理主题)包含了对真实主题引用,可以在任何时候操作真实对象,,在代理主题角色中提供了一个与真实主题一...原创 2019-06-02 13:04:04 · 193 阅读 · 0 评论 -
C++设计模式之职责链模式
目的将请求发送者与接受者耦合在一起,让多个对象都有机会接受请求,让这些对象连接成一条链,并且沿着这条链传递请求,知道有对象处理它为止。角色Handler(抽象处理者)它定义了处理请求的接口,是所有处理者的基类,由于不同具体处理者处理请求方式不同,具体实现方式就交给具体处理者。ConcreteHandler(具体处理者)具体处理者是抽象处理者子类,它具有两个作用:处理请求。传递转发...原创 2019-06-02 12:31:28 · 277 阅读 · 0 评论 -
C++实现设计模式(一)之简单工厂模式
目的通过自己所掌握的C++语言,实现对24种设计模式深刻理解。主要是对每一个模式动机,所具有的角色以及优缺点分析。一、简单工厂模式动机一个工厂类负责所有需要物品。客户端只需要输入某种条件或者触发因子,由工厂负责产生具体某个产品对象。角色(1)工厂类Factory:工厂类是用来制负责生产产品。在工厂类中,需要产生对象产品的函数。这个函数能够根据“标识符”的不同生成不同的ConcreteP...原创 2019-05-22 22:50:39 · 151 阅读 · 0 评论 -
C++设计模式之观察者模式
目的定义了对象之间一对多(或者一对一)的联动,及一个对象的状态或者行为的变化能够导致其他对象状态或者行为也能发生改变,他们之间产生联动。(发布-订阅模式,模型-视图模式,源-监听器模式)。角色Subject(目标类):目标类又称为主题,它是被观察的对象。它可以是具体类,或者基类。它定义了一个观察者的集合,可以增加、删除某个观察者,同时定义了一个通知方法。ConcreteSubject(具...原创 2019-06-01 21:22:35 · 163 阅读 · 0 评论 -
C++设计模式之适配器模式
目的:将一个接口转换成客户希望另一个接口,是接口不同的或者不兼容的那些类可一起工作。角色适配器类(Adapter):作为一个接口或者转换器类对Adaptee与Target进行适配。适配者类(Adaptee):被适配的角色,它定义一个已经存在的接口,或者用户希望使用的业务的方法。目标类(Target):定义了用户要使用的接口,(可以是具体类或者抽象类)。类图C++代码实现class...原创 2019-06-01 12:56:31 · 138 阅读 · 0 评论 -
C++设计模式之装饰器模式
目的了解装饰器模式动机、相应的情景,所拥有的角色以主要思路。装饰模式动态的给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更加灵活。对象结构型模式。动机在不改变对象本身功能前提下给对象本身增加额外的新行为,它是一种用于替代继承的技术。引入装饰类,在装饰类中既可以调用带装饰的原有类方法,还可以增加新的方法,以扩充原有类的功能。分类透明式半透明式类图...原创 2019-06-28 09:04:39 · 339 阅读 · 0 评论 -
C++设计模式之组合模式
组合模式组合模式是组合多个对象形成的树形结构以表示具有整体-部分关系的层次结构,对单个对象(叶子对象)与组合对象(容器对象)的使用具有一致性,因此组合模式又称为部分-整体模式,它是一种对象结构型模式。适用场景在具有整体与部分的层次结构中,希望通过一种方式忽略整体-部分的差异,客户端可以一致的对待。在一个使用面向对象的语言开发系统中需要处理一个树形结构。在一个系统中能分理叶子对象 与容器...原创 2019-09-23 23:09:48 · 318 阅读 · 0 评论 -
C++设计模式之抽象工厂模式
三、抽象工厂模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。产品族与产品等级结构(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机...原创 2019-05-26 20:42:27 · 250 阅读 · 0 评论 -
C++设计模式之解释器模式
解释器模式希望通过一些简单的语言实现一些特定的操作,向计算机输入一个句子或文件,他就能够按照预先定义的文法规定对句子或文件进行解释,从而实现相应的功能。解释器模式描叙了如何为简单语言定义一个文法,如何在该语言中表达一个句子,以及如何去解释这些句子,这就涉及到如何表达一个语言的文法以及如何构造一棵抽象语法树。以具体下面的表达式为例,1+2+3+4-1,可以使用如下的文法规则去表达:expr...原创 2019-09-15 15:51:10 · 163 阅读 · 0 评论 -
C++设计模式(二)之工厂方法模式
二、工厂方法模式类图动机个人理解:基于简单工厂方法模式之上,减轻工厂类负担,将具体某个产品创建交给某个某个具体的工厂。定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类角色(1)抽象工厂所有具体工厂的基类,提供了生产抽象产品的方法。(2)具体工厂具体某个生产某个具体产品的工厂。(3)抽象产品所有具体产品的基类。(4)具体产品优缺点...原创 2019-05-26 14:53:39 · 113 阅读 · 0 评论 -
C++引用与指针区别??
原因:其实自己一直很迷糊引用与指针区别在哪,然后有些时候能区别来,也只停留在指针存储中内容是变量的地址,其本身可能存储在栈上。引用只是变量的别名,本身不占据内存空间。目的:理解引用与指针区别网址:https://www.cnblogs.com/gofighting/p/5440012.html(1)当引用被创建时,它必须被初始化。而指针则可以在任何时候被初始化。(2)一旦一个引用被初始...原创 2019-04-16 14:25:48 · 210 阅读 · 0 评论 -
C++类/struct 相关的sizeof(字节)
序言主要是为了了解一个类当里面有数据时,或者空类时会分配多少个字节。1.为类的非静态成员数据的类型大小之和.2.由编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针).3.为了优化存取效率,进行的边缘调整(对齐).4 .与类中的构造函数,析构函数以及其他的成员函数(静态,全局)无关.类sizeof优化存取效率 ,进行边缘调整,取最大的接近cpu字长的整数倍。...原创 2019-11-02 23:19:53 · 608 阅读 · 1 评论 -
C++如何写一个无法继承的类
序言目前掌握的如下两种方法。一、private二、final (C++11)方法讲解一、private此方法就是在某个类中将此类构造函数声明为private即可。class TestNoInheritance {private: TestNoInheritance(); ~TestNoInheritance();};二、 final此final在C++1...原创 2019-11-03 14:03:24 · 239 阅读 · 0 评论 -
delete new 与 malloc free 区别
废话不多说,整理如下,可能不全面。内存申请方式与位置new 是在自由存储区为对象分配内存 , malloc 是在堆上动态分配内存。自由存储区不仅可以是堆,还可以是静态存储区。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数...原创 2019-11-02 23:20:26 · 90 阅读 · 0 评论 -
C++降低文件之间编译依存关系
序言当我们对某个class(实现)进行修改后,重置程序,原以为只会花几秒时间,可谁知道编译连接时间大大超出我们想象。以下为总结方案去降低文件编译依存关系。1. 声明式依存关系去替代定义式依存关系2. handles 类3. interface 类接下依次为三种方案进行详细解释一、 声明替代定义因为在当我们在头文件中以#include 形式引用某个文件时,你就会发现这引用与定义文件就形...原创 2019-10-29 19:30:11 · 512 阅读 · 0 评论 -
const volatile mutable
序言主要是为了讲解const 与 volatile区别,我们知道const 修饰变量,或者函数,指针等等通常表示它们是不可变的,只读的。但是实际意义上,变量的值是真的不可变,只读的吗,不是,是可变的。更多意义上帮助程序员提前发现问题,避免不该修改的值被意外地修改,但是无法完全保证不被修改。void myPrint(const char *str);void myPrint(const cha...原创 2019-11-13 15:32:27 · 445 阅读 · 0 评论 -
绝不要重新定义继承而来的缺省参数值
序言这里我们必须明白public 继承就是is a 关系,默认子类就是父类,虽然子类有自己新添加的功能,但是基于里氏代换原则,能用到父类的地方也能间接的应用到子类。也就意味着如果保持代码干净性,父类的non-virtual 函数(子类的公有特性提取),如果该函数有变动,可以考虑设为虚函数或者继承原有的non-virtual,子类再重新添加新函数对原有继承进行修改,这样是为了确保不要重新定义继承而...原创 2019-11-03 22:05:27 · 308 阅读 · 0 评论 -
避免遮掩而来的继承名称
序言避免继承而来的名称其实是和作用域有关联,常见的是局部作用域会屏蔽全局作用域。int x; //全局void function(){double x = 0.0; //局部 不论是int 还是doublestd::cin>>x;]C++ 名称这样规则,就是尽量去遮掩名称,至于类型是否相同或者不同,不显得那么重要。当我们实现子类去继承基类时,我们可以理解为子类...原创 2019-11-06 11:39:44 · 183 阅读 · 0 评论 -
typename双重含义
序言模板与泛型编程,我们知道其有面向隐式接口与编译期多态两个特点。显式接口通常由函数签名式(函数名称,参数类型与个数,返回值类型构成),而隐式接口不一样而是由有效表达式组成。例如:template<typename T>void doSomething(T& w){if(w.size() >= 10 && w != someNastyWidge...原创 2019-11-06 18:03:36 · 243 阅读 · 0 评论 -
友元
序言这章主要是讲解C++中友元,其中友元包括友元函数与友元类。它的主要作用是可以访问类中已隐藏或者封闭的私有或者保护的数据成员或者函数。关于友元其特性:(1) 友元关系不能被继承。(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看...原创 2019-11-24 21:41:14 · 750 阅读 · 0 评论 -
了解C++默认调用了哪些常见函数
序言首先C++调用那些默认函数,构造函数,析构函数,赋值运算符重载,拷贝构造函数等等。其他函数目前不涉及,所以后续会补充的。如果某个类不直接明确写出上述函数,该类会由系统默认生成上述函数,如果我们不想使用编译器默认自动生成这些函数,则应该明确拒绝它。构造函数,析构函数就不说了,太熟悉了。拷贝构造函数首先它是一个特殊的构造函数,形参是本类对象的引用,其作用是通过一个已经存在的对象去初始化新...原创 2019-11-21 23:06:20 · 215 阅读 · 0 评论 -
void参数
序言void 参数是指将参数已void形式声明。void func(void);代码void func(void)c语言中,如果函数参数为void来限定此函数不传递任何函数,就是说函数声明原型签名信息不包含参数信息时,此默认为空表示可以传递任何参数,func(1); //没问题c++中,C++标准规定如果没有对参数列表进行定义那么就表示函数不能传递任何参数。func(1) ...原创 2019-11-26 09:03:59 · 2517 阅读 · 0 评论 -
NULL,nullptr,0,(void*)0区别
序言主要是了解空指针表达意思,以及C/C++/C++11在表达空指针上的区别。正文头文件 <stddef.h>#if defined(__cplusplus)#define NULL 0 // C++中使用0作为NULL的值#else#define NULL ((void *)0) // C中使用((void *)0)作为NULL的值#endif因为C语...原创 2019-11-19 08:54:39 · 500 阅读 · 0 评论 -
C++算法篇
目的主要是积累一些常用有效算法,希望有能帮助大家。实例1: 不用新变量,实现两个变量交换值1: 加法a= a+b;b= a-b;a=a-b;2:^a=a^b;b=a^b;a=a^b;2: 不用加减乘除实现加法int add(int num1, int num2){ int sum, carry; do { sum = num1 ^ num2; carry = (num1 & num2) << 1; num1 = sum; num2 =原创 2021-01-24 22:27:49 · 194 阅读 · 0 评论 -
C++中default与delete
前言偶然间看到别人写的代码有这么一小片段Q_DISABLE_COPY(类名)然后再往里追踪#define Q_DISABLE_COPY(Class) \ Class(const Class &) Q_DECL_EQ_DELETE; \ Class & operator=(const Class &) Q_DECL_EQ_DELETE; 而Q_DECL_EQ_DELETE#ifdef Q_COMPLILER_MEMBERS#define Q_DECL_EQ_D原创 2020-11-19 20:45:35 · 453 阅读 · 0 评论 -
C++之::
1.类作用域::表示在某个类下的成员2.::函数名表示输出的意思,取出函数返回结果输出到某个临时变量中。原创 2020-08-07 20:04:30 · 98 阅读 · 0 评论 -
std::thread之join与detach用法区别
困惑主要是没怎么去了解join与detach区别,但是一旦了解了join与detach区别后,却有点困惑。#include "mainwindow.h"#include <QApplication>#include <QDebug>#include <thread>#include <QThread>void func1(){ ...原创 2019-12-01 23:48:02 · 239 阅读 · 0 评论 -
类型转换问题
目的:梳理类型转换问题。对于类型转换,首先得明确有哪些语言类型?语言类型:动态类型与静态类型。强语言类型与弱语言类型。但是 动静态类型,强弱类型没有必要的联系。不能弄混了。(每一个用法、语法、说法都有其存在的意义,即使可能实现的功能一样,但是实现机制或者原理不一样)。具体可以大神参考网址:https://blog.csdn.net/csdn799316120/article/de...原创 2019-05-11 12:43:29 · 748 阅读 · 2 评论 -
C++调用windows系统接口
前言整理常用的windows系统下API接口。头文件声明#include <Windows.h>#include <tlhelp32.h>#include <ShellAPI.h>ShellExecute ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。...原创 2019-07-31 19:27:15 · 5307 阅读 · 0 评论 -
C++嵌入python
序言参数说明代码**序言**上篇介绍了Qt中调用python相关注意事项,这篇着重介绍C++(Qt)如何嵌入python,并且使用python中函数或者类。注意使用头文件声明python.h, 以及对应的python.lib .**参数说明**一、初始化Py_Initialize()python模块初始化操作。二、结束收尾Py_Finalize()释放相关模块操作。三...原创 2019-08-03 18:32:47 · 760 阅读 · 0 评论