
C++
文章平均质量分 84
YzlCoder
未曾有过远大的梦想,只想用双手敲写明天
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
关于运算符重载的两种方式的优缺点比较
大家都知道一般常用两种重载运算符的方式分别是: 1.作为成员函数重载运算符. 2.作为友元函数重载运算符.这里我给个例子.这里是DoubleAclass DoubleA{public: DoubleA(){}; DoubleA(DoubleB m); //DoubleB -> DoubleA ~DoubleA(){}; double x;}原创 2016-03-31 17:06:37 · 8828 阅读 · 0 评论 -
必须要注意的 C++ 动态内存资源管理(一)——视资源为对象
一.前言 所谓资源就是,一旦你用了它,将来必须还给系统。如果不这样,糟糕的事情就会发生。C++ 程序中最常见使用的资源就是动态分配内存(如果你分配了内存却忘记归还它,就会导致内存泄漏)。但是内存只是你必须管理的众多资源之一。其他常见的资源还有:文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字体和笔刷、数据库连接、以及网络sockets。原创 2016-11-02 13:50:21 · 1564 阅读 · 2 评论 -
详解重载解析(一)
一.前言什么是重载解析呢? 我们要解释重载解析就要先了解重载。当我们对同一个函数名写了不同参数列表的版本之后,编译器会生成这个函数的不同重载版本。那么当我们调用这个函数的时候,编译器就会子自动根据实参的参数类型来判断到底调用的是哪个版本的函数。那么编译器选取最合适的函数版本的这一个过程就被称为重载解析。 二.重载解析的步骤在这里我们先不忙考虑含有模板函数的情况,这个问题我们留到下一章来讨论。当没有原创 2016-10-19 15:38:50 · 2204 阅读 · 0 评论 -
C语言 遍历一个文件夹的所有文件
#include #include int main (void){ _finddata_t fileDir; long lfDir; if((lfDir = _findfirst(dir,&fileDir))==-1l) printf("No file is found\n"); else{原创 2016-11-27 18:43:20 · 19883 阅读 · 2 评论 -
C++11移动语义探讨——从临时对象到右值引用
一.前言这篇文章主要谈谈c++11中引入的右值引用概念和移动语义概念。以及这些东西可能在我们编程中带来哪些体验、便捷或者是代码效率的提高。 文章主要分为以下三点:临时对象的产生何谓右值引用何谓移动语义二.临时对象的产生在我们以往的编程过程中可能很少会注意到临时对象(变量)的问题,因为这已经不太是程序层面上的问题,而更多是编译器上的事情。编译器在编译代码过程中为了实现某些代码可能会产生出一些原创 2017-02-07 16:16:41 · 3548 阅读 · 0 评论 -
forward在委托机制中的应用——完美转发
一.前言在之前,我曾花三篇文章讲述了C++委托机制的封装,到最后可以实现任意类型函数的捆绑,包括lambda表达式的注册。然而,这个委托机制还有一点需要完善,可能看标题大家知道这个需要完善的点儿是什么,不过不知道也关系,这个文章会由浅入深的讲述这个问题的来源,以及解决方案。二.问题引入在直接上委托代码之前我们先抽出问题本质,用简单的代码来发现问题,例子来源于<C++ primer>P612: 这个原创 2017-02-07 21:19:41 · 1552 阅读 · 0 评论 -
对象模型 ------- Constructor 构造函数
前言: 之前,在编写C++的一些代码的时候,在类的构造、析构、赋值函数部分,偶尔会出现编译器做出和我初想不一样的决策。后来,看了<深度探究C++对象模型 >这本书后,有的疑问或多或少得到了解决。所以在此,想写一些笔记来记录这些疑问的地方,可能后面关于对象模型还会关于其他方面的文章。不过这个系列文章都主要是以探讨为核心,以后在编程中遇到的相关问题也会不定期在这系列文章继续补充。有的疑问原创 2017-01-20 00:03:28 · 1786 阅读 · 3 评论 -
#define 和 const 定义常量比较。
在C++中可以使用#define或者const来定义常量,但是使用const相比起#define有更多的优点。——–<Effective C++>以下部分内容选自<程序猿面试宝典>const 常量有数据类型,而宏常量是没有数据类型。编译器可以对前者进行类型安全检查,而后者仅仅进行字符替换,没有类型安全检查,并且在字符替换过程中会产生一些意料不到的错误。(边际效应)#define X 10#de原创 2017-03-02 20:06:39 · 3119 阅读 · 0 评论 -
谈谈对象大小——从字节对齐到对象模型
一. 前言 这篇文章主要介绍以下从c的结构体变量到c++的类对象中编译器对内存分配做的事情。总而言之,言而总之,这篇文章就是讲述对于一个变量(对象)它的内存布局是怎么样子的。 为了方便描述,我们按照以下几个层次来讲述: 1.c中struct的字节对齐 2.从struct到class的过渡原创 2017-02-02 22:39:24 · 1120 阅读 · 0 评论 -
类型转换下编译器偷偷做的事————整形提升(Inter Promotion)
一.前言 在讲述这个话题之前,还是先举几个代码例子:long long ll = 1;long l = 2;double db = 3;float f = 4;unsigned int uint = 5;decltype(db + ll) // ->类型?decltype(uint原创 2017-03-03 12:55:57 · 994 阅读 · 1 评论 -
如何辨认一个复杂声明表达式子中变量的类型?
何谓复杂声明表达式子中变量的类型?先来看看这段代码:typedef double* (*a)[10];typedef int* (*b[10])[10];typedef int(*(*c)(int,int))(int);typedef int(*(**d[5])(int))(void(*)(void));以上a,b,c,d 的类型是什么呢?当然,实际工程中不太会出现这么复杂的类型,所以这个知识原创 2017-03-03 21:08:28 · 637 阅读 · 0 评论 -
c++ STL容器的内存分配
一.前言在使用STL各类容器的时候,有时会出现迭代器失效,引用(指针)失效等情况的而发生,即使看似你的操作都是合法的情况下。要了解问题的原因,我们就要了解C++中stl容器的内存分配策略。我们才知道在哪些操作下可能导致迭代器失效,引用(指针)失效。二.问题分类首先我们把以上的问题分成两类:容器的迭代器为什么会失效?容器元素的引用(指针)为什么会失效?因为从内存角度上来讲,如果引用是失效了那么指原创 2016-10-27 23:59:59 · 11324 阅读 · 8 评论 -
必须要注意的 C++ 动态内存资源管理(二)——指针对象简单实现
四.拷贝类型的资源 上节我们说过,对于图片类型的资源我们有时候往往采用拷贝(如果对于那种公共图片,可能采用唯一副本,提供地址使用)。这样情况,我们就需要在拷贝构造函数,以及拷贝赋值函数里面对源地址的内容(对象)进行拷贝。而在析构函数里面要释放自身所占有的资源。template<typename T>class res_ptr{public: typedef res_p原创 2016-11-02 18:12:09 · 976 阅读 · 0 评论 -
c++ 内存泄漏检测
原博客地址:http://blog.youkuaiyun.com/windows_nt/article/details/8652191使用vs的内存检测有以下几种方法。在debug模式下以F5运行:方法一:[html] view plain copy#define CRTDBG_MAP_ALLOC转载 2016-11-04 15:51:08 · 884 阅读 · 0 评论 -
必须要注意的 C++ 动态内存资源管理(六)——vector的简单实现
十六.myVector分析 我们知道,vector类将其元素存放在连续的内存中。为了获得可接受的性能,vetor预先分配足够大的内存来保存可能需要的更多元素。vector的每个添加元素的成员函数会检查是否有空间容纳更多的元素。如果有,成员函数会在下一个可用位置构造一个对象。如果没有可用空间,vector就会重新分配空间;它获得新的空间,将已有元素移动到新空间中,释放旧空间,并添加新原创 2016-11-04 14:30:09 · 2473 阅读 · 0 评论 -
仿函数 ( 函数对象 ) 详解
仿函数是“smart functions”(智能型函数),一般来说我们让一个函数保存状态。使得每次调用函数会因状态不同而执行效果不同。我们一般的做法都是在函数内部定义static变量。但是这是全局变量!所以说,如果使用仿函数,其状态完全可以由自身的一个成员变量来记录。事实上,你还可以在程序中同时拥有两种状态的实体,而这个是用普通函数无法实现的。原创 2016-05-01 09:55:00 · 15944 阅读 · 0 评论 -
C++ 模板函数 知多少?
什么是函数模板呢? 怎么定义函数模板呢? 定义函数模板有什么用呢? 详情点进来!原创 2016-05-02 14:20:30 · 3836 阅读 · 0 评论 -
C++ 重载解析 知多少?
在这里先给大家提出一个问题:编译器怎么知道我调用的这个函数应该是非模板函数?还是特化的模板函数?还是模板函数实例化?更或者是应该选择哪一个模板来实例化?可能上面的问题说起来有点绕,我用下面的代码举例吧:templatevoid Func(T a){ cout void Func(T a);" << endl;}templatevoid Func(T* a){ cout原创 2016-05-02 15:00:49 · 1359 阅读 · 0 评论 -
C++实现委托机制(一)
如果你接触过C#,你就会觉得C#中的delegate(委托)十分灵巧,它的用法上和C\C++的函数指针很像,但是却又比C\C++的函数指针更加灵活。并且委托可以一对多,也就是可以注册多个函数,甚至是某个类的非静态成员函数。而实现事件消息机制【1】也十分依赖于委托机制。基于这样的目的,我们试着在C++上封装出这样的一个委托机制。原创 2016-05-14 23:01:37 · 28312 阅读 · 15 评论 -
C++实现委托机制(二)
上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板。原创 2016-05-15 11:59:05 · 8053 阅读 · 9 评论 -
C++实现委托机制(三)——lambda表达式封装
C++实现委托机制(三)——lambda表达式封装原创 2016-05-17 21:40:33 · 2732 阅读 · 3 评论 -
C++11新特性— auto 和 decltype 区别和联系
编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式原创 2016-05-18 11:18:19 · 22225 阅读 · 14 评论 -
C++ 实现反射机制
JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。然而C++是不支持反射机制,虽然C++有RTTI(运行时类型识别)。但是想要实现C++对象序列化,序列化就是存储到磁盘上,将对象变成一定格式的二进制编码,然后要用的时候再将保存在磁盘上的原创 2016-05-19 20:22:28 · 12275 阅读 · 6 评论 -
必须要注意的 C++ 动态内存资源管理(三)——智能指针
七.前言 在前面一节,我们简单实现了三种类型资源的”指针对象”。其实在c++11的标准库中已经为我们准备了这样的指针对象——智能指针,分别是:shared_ptr , unique_ptr(取代了auto_ptr) , weak_ptr。下面我们简单来介绍一下这三类智能指针的特点和适用情况。八.shared_ptr智能指针 shared_ptr指针适用的就是前一节所原创 2016-11-03 02:03:33 · 1576 阅读 · 0 评论 -
必须要注意的 C++ 动态内存资源管理(四)——智能指针进阶
十一.智能指针的扩展 在前面一节,我们简单介绍了标准库给我们提供的三种智能指针的使用方法。然而在实际使用过程中有的资源的创建和释放并不是简单的new 和 delete。 比如说:对于数据库连接来说,创建资源是连接数据库而释放资源是断开连接。所以,对于智能指针自带的资源释放手段(delete)有时候就不太适用了。当然,智能指针的设计者也考虑到这一点;所以智能指针允许使用者原创 2016-11-03 16:50:44 · 1217 阅读 · 0 评论 -
必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱
十二.小心使用智能指针。 在前面几节已经很详细了介绍了智能指针适用方式。看起来,似乎智能指针很强大,能够很方便很安全的管理我们的资源。然而其实不然,如果不恰当的使用智能指针有时候会在很不起眼的地方造成内存泄漏。在这一节中主要介绍在使用智能指针过程中有哪些地方需要注意,以及 shared_ptr 在使用上的缺陷。十三.使用智能指针的5个条款条款1:不要把一个原生指针给多个share原创 2016-11-03 19:42:42 · 5601 阅读 · 0 评论 -
C++ Vector属性Swizzle实现
一.前言在写gl shader的时候, 我发现glsl的语法中vec可以支持如同如下的语法任意混合属性vec3 pos;pos.xyzpos.yxzpos.xxxpos.zx...我们可以很容易的在C++写一个2、3个属性的vec类,但是如何使得vec也支持如上语法将属性进行混合呢?二.方案一我们或许可以想到,利用uion+struct来实现struct vec3{原创 2017-12-06 17:36:14 · 1729 阅读 · 0 评论