
C++language and related
文章平均质量分 72
用于学习C/C++相关知识的记录
zhczzm
互联网大厂工作,10年linux下 c++开发经验,从事性能优化调优工作,对c11/c14/c17新特性有深刻的认识,对于c++代码异常处理有比较多的实战经验,精通linux下coredump分析,网络通信,数据结构和算法。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
mutex原理深入分析
mutex,lock_guard的底层原理实现原创 2025-04-29 04:12:36 · 1221 阅读 · 0 评论 -
C++ RAII 与RTTI 机制
在C++中,RAII(Resource Acquisition Is Initialization) 和 RTTI(Run-Time Type Information) 是两个核心机制,分别用于资源管理和运行时类型识别。原创 2025-04-23 09:01:39 · 310 阅读 · 0 评论 -
C++ pure virtual method called报错,与原因分析
C++ pure virtual method called原创 2023-02-12 23:16:20 · 4991 阅读 · 0 评论 -
C++中的多态
虚函数表原创 2023-02-12 17:19:39 · 307 阅读 · 0 评论 -
仿函数和重载<在sort和set中的应用
这里记录下仿函数和重载<在 sort和set 中的应用#include<iostream>#include<vector>#include<set>using namespace std;class Data{public: Data(int aa){ a_=aa; } /*bool operator < (const Data&d2) const{ return this-&.原创 2022-05-03 08:06:36 · 237 阅读 · 0 评论 -
带继承和组合关系的类中构造函数和析构函数的调用顺序
1.构造函数构造函数的调用顺序如下:基类构造函数,C++提出的成员初始化列表,对象成员构造函数(非指针类型),派生类本身的构造函数。2.析构函数调用顺序,析构函数的调用顺序如下:(析构函数的调用顺序正好和构造函数的调用顺序相反)派生类本身的析构函数,对象成员的析构函数,基类的析构函数。这里没有写这个C++提出的成员初始化列表的原因是,他只是负责构造了,构造之后,析构就都是调用对象成员的析构函数了。这里给出具体的例子看下:首先这个例子先不给出 C++提出的成员初始化列表,让我们原创 2022-04-22 09:54:48 · 1450 阅读 · 2 评论 -
Typedef的作用
1.定义一种类型的别名,而不只是简单的宏替换。例子:typedef unsigned char uint_8;typedef char int_8;typedef std::shared_ptr<Table> TablePtrType;2.用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如: struct tagPOINT1 { int x; in原创 2022-01-10 11:32:26 · 845 阅读 · 0 评论 -
关于C/C++编译器
我们在开始学习C/C++语言之前肯定得会学习程序运行的过程,主要是编译器在起到很大的作用,包括预处理:把头文件替换,宏替换,编译优化:转化为汇编语言汇编阶段:把汇编语言翻译成机器指令链接阶段:将目标文件链接起来生成可以执行的文件。那么常见的编译器有哪些呢?1.GNU Compiler Collection (GCC)GCC 原来作为GNU 操作系统的官方编译器,但是后来已经作为类unix操作系统:比如 linux,Mac OS x等,采纳为标准的编译器,GCC也同样支持Win原创 2021-04-09 14:27:13 · 1282 阅读 · 0 评论 -
结构体内存对齐的原因以及如何进行内存对齐
1.结构体内存对齐的原因?什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,原创 2020-11-16 19:47:17 · 1540 阅读 · 0 评论 -
关于VS2013中的生成,重新生成,仅用于项目生成,重新生成
最近在编写代码中遇到了一个非常奇葩的问题,就是我再头文件中添加了一个锁的定义,就导致程序编译后必现崩溃,而且崩溃点和我的代码没有啥关系,后来花了将近一天的时间,定位出原因是我没有重新生成,而只是生成。下面说说下面四个的区别1.生成2.重新生成3.仅用于项目生成4.仅用于项目重新生成当一个解决方案中的项目没有依赖项目时,1.3相同,2.4相同。生成的意思是,如果你之前已经编译过了,那生成只是进行编译你改变的文件,不改变的文件就不再重新编译,直接进行连接了,这个在项目工程文件比较大的原创 2020-06-05 22:13:11 · 1882 阅读 · 0 评论 -
C++ 动态分配内存的好处
实例化一个类有两种方式:// 假设有一个类A// 方式一:直接定义法A a;// 方式二:动态内存分配法A * a = new A();两者有什么差别呢?实际上,方式二即等价于如下代码:A * a = new A();等价于A * a;a = new A();方式一就是直接将a放入栈区(局部变量,大小受限,自动释放);方式二则是在堆区(动态内存,大小任意,手动释放)分配一块内存,然后用指针a去指向这块内存;那么我们很容易就知道为什么要使用动态内存分配来实例化转载 2020-05-16 20:26:47 · 2749 阅读 · 0 评论 -
C++语言中函数参数传递的本质是值传递
C语言中只有值传递,也就是传递副本,指针传递的只是地址的副本当然,如果你传递了一个指向某个变量的指针,而函数对该指针执行了间接访问操作,那么函数就可以改变那个变量,但参数还是传值方式传递的,这是两个概念,不矛盾。而对于引用传递,表面上看不会产生一个副本,看下面的代码吧,不多多了#include<iostream>#include<string>using ...原创 2020-03-05 19:57:19 · 633 阅读 · 0 评论 -
strcpy,memcpy,memmove的区别
一.memcpy与strcpystrcpy和memcpy主要有以下3方面的区别。1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起内存溢出。memcpy则是根据其第3个参数决定复制的长度。3.用途不同。通常在复制...原创 2020-03-03 14:18:15 · 443 阅读 · 0 评论 -
char 和 unsigned char 的区别
1、char取值范围是 -128~+127。2、我们先来看 signed char的最大值。 最高位是 符号位, 0 代表正数; 1 代表负数。0 1 1 1 1 1 1 1 这个值等于 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 = 127 。 也有一个简便计算方法:2^7 -1 = 128-1 =127 所以,signed...原创 2020-03-03 09:31:22 · 46122 阅读 · 2 评论 -
用C++实现遍历windows下的所有进程然后根据路径名字正则表达式判断后,取pid杀死特定的进程
#include <iostream>#include <windows.h>#include <tlhelp32.h>#include <string>#include <tchar.h>#include <Psapi.h>#include <map>#include <regex>...原创 2020-03-02 16:58:30 · 853 阅读 · 0 评论 -
C++命名空间 namesapce
最近在使用命名空间,想把命名空间总结下,现在只是简单的记录下使用的心得,后期会进行进一步的整理1.就是我们是把我们的.cpp文件和.h文件都使用相同的命名空间,如果不这样做 ,会可能出现下列问题。1.1 只在头文件中使用,那么要包含头文件,使用头文件里声明的类或者方法时,要using namespace ...而在.cpp中没有使用 ,起不到保护的作用。1.2只在cpp中使用,那.........原创 2019-12-10 14:14:17 · 461 阅读 · 0 评论 -
二级指针(指向指针的指针)
指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:将这种关系转换为C语言代码:...转载 2019-09-26 15:43:13 · 6388 阅读 · 8 评论 -
用for循环进行一定次数的发送操作,结果发送的次数非常多,跟本停不下
师弟在做实验时,用32单片机的串口向上位机发送1024字节的数据,结果在串口上看到的是永不停止的数据上传上去了。程序如下:u8 i=0;for(i=0;i usart1denddate();原因很简单,就是因为u8 i最大的数是255,结果到了255后就变为了0,所以永远不会到达for循环终止的条件,所以会在串口1上一直向上发送着数据。原创 2015-11-22 11:39:46 · 1050 阅读 · 0 评论 -
C语言中变量初值问题
针对编译环境是VC++6.0(1)对与全局变量如果没有给变量赋初值,初值默认为0;测试代码如下:#includeint a;int main(void){printf("%d\n",a);return 0;}运行结果是:0(2)对于局部变量如果没有给变量赋初值,后果未知测试代码如下:#includeint main(void)原创 2015-09-10 15:25:36 · 2071 阅读 · 1 评论 -
C语言中的memset函数
(1)函数原型:void *memset(void *s, int ch, size_t n);函数解释:将s中前n个字节替换为ch并返回s;(2)头文件:在C中头文件是 or (3)应用memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。举例使用:(1 )清空字符型数组ch原创 2015-09-07 10:10:38 · 1330 阅读 · 0 评论 -
C语言中变量定义的位置
今天编了一道C语言程序,编译的时候,出现错误,源码如下://输入一行字符串,统计大小写字母,空格的个数#include#includeint main(){char a[30];char *p=a;printf("please enter strings:\n");gets(p);int i=capital_letter=lowercase_lett原创 2015-09-04 10:22:05 · 4042 阅读 · 0 评论 -
C++的三种单例模式-----深度解析
简介 因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情...原创 2018-03-06 17:03:00 · 107951 阅读 · 34 评论 -
关于extern "C"深度剖析以及宏__cplusplus的作用
在自己第一次接触C++ dll的概念以及书写dll的时候,就会在网上看到这样的说法,在dll导出的时候,一定要加上extern "C",至于为什么大概知道是因为,C编译器和C++编译器对函数的处理不太一样,所以要这样做,没有深追究,但是后来别人问起的时候,感觉总是说的不是特别的透彻。具体的问题可能如下:1.如果我的代码只是在C++上使用,也就是只是在C++的编译器上应用,而不是放到C编译...原创 2019-06-30 16:36:08 · 708 阅读 · 0 评论 -
静态成员函数
(1)静态成员函数是类的一部分,而不是对象的一部分,与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。(2)当调用一个对象的普通成员函数的时候,系统会把该对象起始地址,赋给成员函数的this指针,而静态成员函数,与任何对象都无关,因此静态成员函数没有this指针。因此决定了静态成员函数不能访问本类中的非静态成员,原创 2017-02-18 23:04:52 · 499 阅读 · 0 评论 -
C ++ 拷贝构造函数和赋值构造函数 非常经典
C++ 拷贝构造函数 赋值构造函数拷贝构造函数和赋值构造函数的异同由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a,b 为例,Cla...原创 2016-10-26 11:53:50 · 4362 阅读 · 0 评论 -
C++ 类继承的深入理解
说起继承,就是对现有的类的方法和字段进行重复的使用这里只是想总结下初学的时候的一些思想误区,供刚入门的小白参考下:我这里只说公有继承,public的形式,其他形式不进行讲解,也基本用不到。误区1:子类继承父类以后总是在考虑这个属性和方法,是归谁所有,是不是继承到子类了,还是归父类所有,只是我们能够使用?以及访问属性的问题具体解答如下:(1)公有继承父类的方法,继承完父类所有的属...原创 2018-03-01 20:27:51 · 1426 阅读 · 0 评论 -
堆和栈的区别(非常经典)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构转载 2016-10-26 14:13:38 · 514 阅读 · 0 评论 -
string 类 用.at越界抛出异常捕捉
#include #include#includeusing namespace std; int main(int argc,char * argv[]){ string Variable("zhang"); cout char temp='a'; try { temp = Variable.at(9原创 2016-10-28 11:08:40 · 1210 阅读 · 0 评论 -
c++中 new的使用 以及new 和 new(std::nothrow)
源码方面的信息就不详细讲述了,找找代码看看便知,简要说明下:new(std::nothrow) 顾名思义,即不抛出异常,当new一个对象失败时,默认设置该对象为NULL,这样可以方便的通过if(p == NULL) 来判断new操作是否成功普通的new操作,如果分配内存失败则会抛出异常,虽然后面一般也会写上if(p == NULL) 但是实际上是自欺欺人,因为如果分配成功,p肯定不为NUL原创 2016-11-10 10:02:51 · 2496 阅读 · 0 评论 -
野指针和内存泄漏以及内存溢出总结
野指针(Wild Pointer ):指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。1.指针变量未初始化任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将原创 2016-10-31 15:35:30 · 4735 阅读 · 6 评论 -
vs2013中 项目->生成/重新生成以及仅用于项目的区别,以及项目依赖项的设置
VS中生成在上次编译的基础上,只对改动过的文件重新生成,没有改动过的文件不会重新生成。VS中重新生成对所有的文件都重新生成。如果引用了其它类库的DLL,也会重新生成其它的类库,这样速度要慢些,但可靠度高一些。 仅用于项目在正常的情况下,他和 项目->生成/重新生成 没有什么区别,只有在这个项目有项目依赖项的时候是不同的。如上图所示,下面的项目test2,要原创 2016-11-29 08:52:22 · 5794 阅读 · 0 评论 -
构造函数的显示调用和隐示用例子
#include using namespace std;//class MyClass{public: MyClass(int value) :mValue(value) { } void display() { cout }private: int mValue;};原创 2016-10-25 14:24:30 · 976 阅读 · 0 评论 -
常指针和指向常量的指针的区别
最近在学习引用,有一些学习心得,记录如下:1.引用是变量的别名int a;int b&=a;要注意引用只有声明,而没有定义,并且引用必须在声明的时候进行初始化,一旦与某个变量关联起来,就将一直效忠于它。2.引用的实质是指针。其中引用出现在C++中的理由,也是为了在一定程度上回避一下C语言中的指针问题。引用相当于 常指针 int a;int &b=a;//原创 2016-10-10 17:27:15 · 6602 阅读 · 0 评论 -
函数重载和函数模板的区别
函数重载通常在C语言编程中,如果我们比较三个整数的大小,我们可以进行编写一个max()函数,而如果我们要继续比较三个浮点数的大小,就需要重新编写一个函数,函数体基本是完全相同的,就是返回值和参数类型是不同的,但是函数名称不能是一个了,所以要写第二个函数max1()。在C++中就可以避免这个问题,允许用同一个函数名定义多个函数,但是一定要注意一点,重载函数的参数个数、参数类型、参数顺序、这三原创 2016-10-10 19:42:40 · 6861 阅读 · 2 评论 -
虚函数中virtual关键字的使用问题
在C++中用到关键字virtual的一共有两个部分一个是虚继承,一个是虚函数今天主要讲解虚函数中用到virtual的一些简单部分。就当是加深记忆1.在基类中声明虚函数一定要用关键字 virtual2.而如果虚函数的实现单独来做,则不能用virtual关键字,否则会报错。3.而在自类中对虚函数进行重写的时候,需要先在自类中声明这个虚函数,可以加 virtual关键字,也可以不加,原创 2016-10-11 13:34:49 · 4992 阅读 · 0 评论 -
一般----派生类构造函数的写法
定义派生类构造函数应该包括三部分内容(1)对基类数据成员进行初始化(2)对子对象数据成员进行初始化(3)对派生类数据成员初始化一般形式为:派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表){ 派生类中新增数据成员初始化语句}注意: 总参数表中的数据 包括 形参类型和形参变量 而参数表中只有变量名没有变量类型。例子就原创 2016-10-11 14:18:54 · 4117 阅读 · 0 评论 -
ICE通信 ----实现vs2013客户端服务器之间的简单通信,hello world 程序。
在电脑上安装两个 安装包 Ice-3.5.1-VS2013.msi 和Ice-3.5.1.msi其中第一个文件的作用是 在 vs2013 的项目--》》属性中--》》ICE configration进行配置的界面。然后把自己写的ICE程序放在这个 资源文件下,然后进行ICE 的配置,配置完成后会自动生成 h和.cpp文件。然后再自己书写 server.cpp 具体书写内容...原创 2016-10-14 11:20:43 · 3762 阅读 · 0 评论 -
c++ 中用typedef定义新类型(类对象)小例子
#include using namespace std;//class MyClass{public: MyClass(int value) :mValue(value) { } void display() { cout }private: int mValue;};原创 2016-10-25 14:21:29 · 2372 阅读 · 0 评论 -
windows静态库动态库的原理以及是否需要.h文件
静态库的调用方法第一种:项目设置中引用,在项目的属性中设置。 第二种:在代码中使用 #pragma comment(lib,"lib文件名")第一种方法: 步骤一: 右键单击项目—>属性—>配置属性—>链接器—>常规—>附加库目录 在其中填入lib库的目录,也可以是相对或绝对路径。 步骤二: 右键单击项目—>属性—>配置属性—>链接器—>输入—>附加依赖项转载 2016-11-29 08:58:57 · 2204 阅读 · 0 评论 -
C++中的::的作用
(1)作用域限定符,当在类体中直接定义函数时,不需要在函数名字的前面加上类名,但是在类体外实现函数定义的时候,必须加上类名并且加上作用域限定符。Student::Display();(2)原创 2017-02-18 21:44:21 · 33034 阅读 · 0 评论