
c/c++
文章平均质量分 55
yhc166188
路虽远,行则将至;事虽难,做则必成!
展开
-
什么是面向过程和面向对象
一、先来两小段通俗解释面向过程(Procedure Oriented 简称PO :如C语言):从名字可以看出它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。面向对象(Object Oriented简称OO :如C++,JAVA等语言):看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对原创 2020-09-12 10:27:13 · 1079 阅读 · 0 评论 -
裸指针与智能指针的线程安全问题
文章目录裸指针线程安全问题使用普通裸指针造成的问题shared_ptr 和 weak_ptr的解决问题shared_ptr的线程安全问题智能指针shared_ptr本身(底层实现原理是引用计数)是线程安全的智能指针指向的对象的线程安全问题,智能指针没有做任何保障多线程编程中的三个核心概念总结解决办法-加入锁机制裸指针线程安全问题使用普通裸指针造成的问题#include <iostrea...原创 2020-05-02 16:43:09 · 1203 阅读 · 0 评论 -
gdb调试总结笔记
文章目录一、介绍二、简单操作三、用GBD 调试多进程程序四、用gdb调试多线程程序五、用gdb工具分析core文件1、core文件开关2、core文件命名和保存路径3、分析Core 文件4、运行这个有bug 的程序,可以在当前目录下生成core文件六、调试一个正在运行的程序七、设置断点的方式八、断点操作九、在调试程序时,gdb常用命令总结一、介绍GDB是GNU开源组织发布的一个强大的UNIX下...原创 2020-04-27 15:50:07 · 394 阅读 · 0 评论 -
深入程序编译链接和装载过程
文章目录预编译编译汇编链接深入编译链接和运行CPU、内存 与 I/O在Linux下使用GCC来编译 Hello World 程序时,只需使用最简单的命令(假设源代码文件名为 hello.c)事实上,上述过程可以分解为4个步骤:预处理(Prepressing) 、编译(Compilation) 、汇编(Assembly) 、链接(Linking)预处理,生成预编译文件(.i文件): gcc...转载 2019-12-21 20:59:14 · 543 阅读 · 0 评论 -
c++ public,protected,private 用法
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。这里我们首先要明白下面几点。1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:用户代码(类外...转载 2019-06-19 18:42:23 · 139 阅读 · 0 评论 -
C++中基类的析构函数为什么要用virtual虚析构函数
大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生...原创 2018-08-11 15:53:07 · 19533 阅读 · 3 评论 -
C++之多重继承
大多数应用程序使用单个基类的公用继承,但是在某些情况下,单继承是不够的,必须使用多继承。C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承.举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。如下图示:代码实现://多重继承#include <iostream>using namesp...原创 2018-08-11 16:35:16 · 15000 阅读 · 1 评论 -
C++ 反射机制
反射机制:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为语言的反射机制。Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说”自审”,并能直接操作程序的内部属性。即可以在运行时加载、探知、使用编译期间完全未...原创 2018-10-25 19:41:47 · 1155 阅读 · 1 评论 -
C++ string类insert用法总结
basic_string& insert( size_type index, size_type count, CharT ch ); 在index位置插入count个字符ch string str = "meihao"; string sstr = str.insert(0,2,'a'); cout<<sstr<<endl; ...转载 2018-10-30 17:29:46 · 6186 阅读 · 0 评论 -
C++使用初始化列表初始化数据成员的三种情况
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员(构造函数列表的初始化方式不是按照列表的的顺序,而是按照变量声明的顺序同时初始化显隐数据成员);2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因:原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据...原创 2018-08-11 15:04:27 · 14076 阅读 · 2 评论 -
c++ 空类,含有虚函数的类的大小
1、为何空类的大小不是0呢?为了确保两个不同对象的地址不同,必须如此。类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0.2、请看下面的类:class A{ virtual void f(){} };class B:pub...原创 2018-07-22 21:48:53 · 3484 阅读 · 0 评论 -
c++14新特性
在C++的时间表中,C++14按计划是一个小版本,完成制定C++11标准的剩余工作,目的是使C++成为一门更清晰、更简单和更快速的语言。新的语言特性留到了未来的C++17标准中。C++14的主要特性可以分为三个领域:Lambda函数、constexpr和类型推导。Lambda函数C++14的泛型Lambda使编写如下语句成为可能:auto lambda = [](auto x...转载 2018-07-30 17:53:46 · 928 阅读 · 0 评论 -
UML类图总结(浅显易懂实用)
UML类图的作用是描述程序中类的信息及各个类之间的关系。所有的面向对象(Object Oriented)语言都离不开类的概念,理解了程序中类的设计也就理解了程序的一半。但类的具体描述方式在各个类中都不一样,UML类图的提出是为了能够脱离语言的限制,抽象地描述各个类的信息及各个类之间的关系。这是UML类图的作用。一、类的基本表示方式在UML类图中,每一个矩形代表一个类。我们举一个简单的例...转载 2018-07-26 17:05:54 · 258 阅读 · 0 评论 -
C++11特性(模板类 initializer_list)
C++primer 原文如下:通读原文相关篇幅,分析解读内容如下:提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同一类型)的元素传递给函数。代码:/* initializer_list 是C++11新增的,可以使用它来初始化STL: 例如:std::vector<double> payments {45...原创 2018-07-17 17:52:49 · 1256 阅读 · 0 评论 -
libevent windows编译
1.官网下载http://libevent.org/最新源码2.打开vs命令行工具进入libevent-2.1.8-stable目录下执行nmake ./Makefile.nmake 只要三个libevent.lib,libevent_core.lib,libevent_extras.lib编译出来即可下面的命令也可全量编译:nmake /f Makefile.nmake [all] /...原创 2018-07-17 14:44:04 · 225 阅读 · 0 评论 -
c++读写文件
掌握文本文件读写的方法了解二进制文件的读写方法C++文件流:fstream // 文件流ifstream // 输入文件流ofstream // 输出文件流//创建一个文本文件并写入信息//同向屏幕上输出信息一样将信息输出至文件#include<iomanip.h>#include<fstream.h>void main(){ ofstream f1("d:\\me...转载 2018-07-16 14:36:11 · 193 阅读 · 0 评论 -
进程间通信(IPC)介绍
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。1、特点:它是半...原创 2018-06-19 15:41:01 · 238 阅读 · 0 评论 -
malloc/calloc/realloc/alloca内存分配函数
calloc(), malloc(), realloc(), free(),alloca()内存区域可以分为栈、堆、静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的。利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和reall...转载 2019-01-15 09:11:13 · 281 阅读 · 0 评论 -
srand和rand的用法
srand和rand()配合使用产生伪随机数序列。 rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。 如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。 srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上...转载 2019-01-31 15:10:56 · 387 阅读 · 0 评论 -
C/C++基本数据类型所占字节数
1字节=8位1k=1024字节=2^101m=1024k1g=1024msizeof(int)表示存储一个整数所需要的字节数。因此,sizeof(int)*p要么等于4*p,要么等于2*p。例如:在16位编译系统,sizeof(int)=2,unsigned int 最大长度是65535。在32位编译系统,sizeof(int)=4买硬盘实际内存小是因为厂商当1000换算的...原创 2019-02-12 13:55:57 · 673 阅读 · 0 评论 -
C++ 如何删除string最后一个字符
#include<iostream>#include<string>using namespace std;int main() { string str; str = "123456"; cout << str << endl; //方法一:使用substr() str = str.substr(0, str.length(...原创 2019-08-30 20:20:41 · 5202 阅读 · 0 评论 -
反向迭代器(rbegin,rend)
C++ primer (中文版第四版)第273页9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。c.begin() 返回一个迭代器,它指向容器c的第一个元素c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置c.r...原创 2019-08-03 19:10:13 · 974 阅读 · 0 评论 -
OOA/OOD/OOP
Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动...转载 2019-07-24 16:46:22 · 239 阅读 · 0 评论 -
c++编程规范
这个规范是我在以前的公司制定的,我自己一直按照这个规范来写代码。现在重新整理出来。很多人都制定过规范,但没有强制力去执行,还是无用。每个人都有自己的习惯,让别人都遵从某件事是很难的。现在我都不奢望可以改变其他人了,但还可以让自己做好一点点。------------------------------------------综述C++ 是一门十分复杂并且威力强大的语言,使用这门语言的...转载 2019-07-04 10:19:53 · 1772 阅读 · 0 评论 -
指针常量和常量指针
1、指针常量——指针类型的常量(int *const p)本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下:int a = 10, b = 20;int * const p = &a;*p = 30; // p指向的地址是一定的,但其内容可以修改2、常量指...转载 2019-06-12 11:45:23 · 653 阅读 · 0 评论 -
深入分析C++引用(指针常量)
引言我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少从面试者中得到关于C++引用的正确答案。那么c++中引用到底意味这什么呢?通常一个引用让人想到是变量的别名,而我讨厌将c++中引用定义为变量的别名。这篇文章中,我将尽量解释清楚,c++中根本就没有什么叫做别名的东东,而是一...翻译 2019-06-12 11:16:42 · 1684 阅读 · 1 评论 -
C/C++ 中 static 的用法
C语言: 1、静态全局变量: 1、在全局变量前加上 static 关键字,即为静态全局变量 2、静态全局变量在程序的数据区分配内存,若未初始化则默认初始化为0,直到程序结束才销毁 3、静态全局变量在该文件内可见,从变量定义处开始直到文件结束(普通全局变量在同一程序的其他文件中可见,默认是 external 属性,而静态全局变量是 internal 属性), 而在其他文件中不可见...转载 2019-06-16 13:22:51 · 580 阅读 · 0 评论 -
详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别
对于c语言中指针的操作符有两个:&和*。对于&,就是“取地址”的意思。但对于*,翻译为“解引用”,字面意思不好理解,即使看了后面内容才知道不过是“取指针指向的地址的内容”,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中保存的值。...转载 2019-06-20 14:15:26 · 9466 阅读 · 4 评论 -
C++ const用法 尽可能使用const
C++const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。1.const 修饰成员变量#include<iostream>using namespace std;int main(){ int a1=3; ///non-con...转载 2019-06-16 10:32:42 · 235 阅读 · 0 评论 -
c++数值极限numeric_limits
一般来说,数值类型的极值是一个与平台相关的特性。c++标准程序库通过template numeric_limits提供这些极值,取代传统C语言所采用的预处理常数。你仍然可以使用后者,其中整数常数定义于<climits>和<limits.h>,浮点常数定义于<cfloat>和<float.h>,新的极值概念有两个优点,一是提供了更好的类型安全性,二是程...转载 2019-05-17 10:06:23 · 18444 阅读 · 1 评论 -
c++比较字符串大小或版本号大小
#include<string.h>#include<stdio.h>int main(int argc,char *argv[]){ char *s1 = argv[1]; char *s2 = argv[2]; int r; int len1 = strlen(s1); int len2 = strlen(s2); ...原创 2019-04-23 15:54:07 · 1903 阅读 · 0 评论 -
cmake介绍
cmake是一个构建C++代码的跨平台工具,他能够干什么呢?他能够搜索你的平台环境,然后生成平台上用于Build的文件。在Windows上安装了Visual Studio, 他能够帮你生成.sln, .vcxproj文件。如果在Linux上,能够帮你生成makefile。在MAC OS上,帮你生成xcode的项目文件。利用这些文件你就可以在本地编译,链接文件。生成这些项目,solution文件的输...原创 2018-06-25 17:43:09 · 710 阅读 · 0 评论 -
C++内存管理(很全,例子很详细)
C++内存管理详解l内存分配方式在C++中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区.栈:存放函数参数以及局部变量,在出作用域时,将自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限.堆:new分配的内存块(包括数组,类实例等),需delete手动释放.如果未释放,在整个程序结束后,OS会帮你回收掉.自由存储区:mallo...转载 2018-06-16 14:51:29 · 429 阅读 · 0 评论 -
c++11 std::bind std::function
std::function是可调用对象的包装器,它最重要的功能是实现延时调用我们给std::function填入合适的函数签名(即一个函数类型,只需要包括返回值和参数表)之后,它就变成了一个可以容纳所有这一类调用方式的“函数包装器”。格式 std::function<返回值(参数表)>例:#include "stdafx.h"#include<iostream>// std...原创 2018-02-09 11:24:03 · 449 阅读 · 0 评论 -
c++模板 template
引言模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。函数模板在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下:void swap(int&a , int& b) { int temp = a;转载 2017-10-22 19:57:25 · 249 阅读 · 0 评论 -
C++11 左值、右值、右值引用详解
左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b转载 2018-01-02 14:37:38 · 253 阅读 · 0 评论 -
obs-studio cmake下载编译安装
提前准备环境: Git VS 2015 Qt5 (qt-opensource-windows-x86-5.9.1.exe)安装时不要默认安装 去掉Android ARMv7 勾选msvc2015 32-bit 安装CMake 3.8.1 以上几个最基本的,我就不提供下载地址了;OBS在VS2015上开发所需要依赖的库:https://obsproject.co原创 2017-11-29 11:51:10 · 841 阅读 · 0 评论 -
Visual Studio 单元测试 C++ 版
1. 简介 软件质量要求的提升迫使码农们越来越重视单元测试,测试驱动开发的观点受到更多人的支持。目前,支持单元测试的第三方框架也非常丰富,就C++而言,有gtest, CppTest 等。 Visual Studio 自带的单元测试框架也非常的便利。之前一直使用 gtest 进行测试,今天小试了一把VS 的测试框架,将配置过程记录下来。2. 如何对 exe 工程进行单元测试转载 2017-10-24 16:26:31 · 535 阅读 · 1 评论 -
c++11 override and final
1.简介C++为我们提供了继承和虚函数的重写特性。 在派生类中,重写虚函数不强制要求使用 virtual 关键字,并且C++并没有要求强制检查虚函数的重写是否真正覆盖了基类的虚函数,因为在派生类中,也可以增添新的虚函数,以供下一级的派生类重写。由于检查的不够严谨,就有可能产生错误。2.有可能产生的错误最常见的错误就是派生类想要重写基类的虚函数,但是由于参数类型的不同,导致结转载 2017-10-24 16:16:54 · 341 阅读 · 0 评论 -
c++11 class enum
1.简介以往的enum类型将枚举成员的作用域暴露在枚举变量之外,用户不需要指定枚举类型就可以直接使用枚举的内容,这就有可能会造成名字的冲突,为了解决该你问题,C++11引入了强类型的枚举类型(strongly typed enums ).2.旧风格的enum[cpp] view plain copy#include "stda转载 2017-10-24 16:15:36 · 1234 阅读 · 0 评论