
C++
文章平均质量分 81
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
C++回调函数用法
一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。 而 那个函数在需要的时候,原创 2013-12-26 21:15:40 · 1934 阅读 · 0 评论 -
C++虚函数表解析
C++ 虚函数表解析 陈皓http://blog.youkuaiyun.com/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,R转载 2014-04-07 16:00:13 · 1087 阅读 · 0 评论 -
C++ Primer ---适配器 queue
一,概述 先进先出的数据结构,底端加入元素,顶端移除元素,类似stack同样不能有遍历行为,没有迭代器。也是以既有容器为底端容器被归类为陪接器(container adapter),默认底端容器为deque。二,使用 #include using namespace std;三,方法queue::push( );原创 2014-01-15 19:47:44 · 1589 阅读 · 0 评论 -
C++ class中static私用成员
C++ class中的静态(static)成员(1) 静态数据成员 ①一般地静态数据成员在该类定义之外被初始化,如同一个成员函数被定义在类定义之外一样。在这种定义中的静态成员的名字必须被其类名限定修饰,例如下面是_interestRate的初始化// 静态类成员的显式初始化#include "account.h"double Account::_interest转载 2014-03-24 15:52:08 · 1369 阅读 · 0 评论 -
C/C++中static关键字的用法
一、在面向过程设计中的static关键字1、静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。 特点: A、该变量在全局数据区分配内存。 B、初始化:如果不显式初始化,那么将被隐式初始化为0。 C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件原创 2014-04-08 16:29:34 · 1877 阅读 · 0 评论 -
C++引用&和指针在作为形参时的区别
nt n;int &m = n;在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的。对于引用,有以下三条规则:(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。 (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NUL原创 2014-04-07 22:16:06 · 4158 阅读 · 2 评论 -
C/C++混合编程--extern “C” 使用方法详解
extern "C" 是为了C与C++混合编程而设立的关键字,假如你已经知道了关于extern "C" 的一些使用方法,想很快掌握使用策略,下面从两个角度说明:1)在C++程序中调用C程序,比如在CPP文件中使用C文件的某一个函数,那么可以肯定的是所使用的函数肯定是按照C语言的编译方式编译,那么仅仅通告CPP文件按照C语言调用函数的方式调用即可,而且不用再重新编译C函数,在函数所在头文件中添加原创 2014-04-07 21:06:53 · 6435 阅读 · 0 评论 -
C++智能指针--unique_ptr
unique_ptr是一个独享所有权的智能指针,它提供了一种严格语义上的所有权,包括: 1、拥有它所指向的对象。 2、无法进行复制构造,也无法进行复制赋值操作。也就是说,我们无法得到指向同一个对象的两个unique_ptr。但是可以进行移动构造和移动赋值操作。 3、保存指向某个对象的指针,当它本身被删除释放的时候(比如,离开了某个作用域),会使用给定的删除器释放它指向原创 2014-07-05 22:14:00 · 1599 阅读 · 0 评论 -
C++智能指针--auto_ptr指针
这里先介绍auto_ptr的缺陷:因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr pstr (new char[12] ); //数组;为定义然后释放资源原创 2014-07-05 22:05:44 · 3050 阅读 · 0 评论 -
C++智能指针--weak_ptr
weak_ptr是对对象的一种弱引用,它不会增加对象的引用计数。weak_ptr和shared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr)。 单纯使用shared_ptr有时会产生问题,考虑下面的代码: 1 class原创 2014-07-05 22:12:35 · 2372 阅读 · 0 评论 -
C++智能指针--shared_ptr
shared_ptr是一个引用计数智能指针,用于共享对象的所有权。它可以从一个裸指针、另一个shared_ptr、一个auto_ptr、或者一个weak_ptr构造。还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。删除器用于处理共享资源的释放,这对于管理那些不是用new分配也不是用delete释放的资源时非常有用。shared_ptr被创建后,就可以像普通指原创 2014-07-05 22:13:17 · 2702 阅读 · 0 评论 -
静态成员函数不能用const修饰 ,也不能存取nonstatic数据
C++中静态成员函数不能用static修饰的原因:static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。 不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访原创 2014-08-04 14:44:10 · 2304 阅读 · 0 评论 -
C++中str1::function和bind
在C++的TR1中(TechnologyReport)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. >. Item 35.下面具体说明其使用方法。一、指向全局函数或静态成员函数时因为在本质上讲全局函数和静态成员函数没有区别,使用方法上除了静态成原创 2014-07-05 22:15:35 · 1978 阅读 · 0 评论 -
C++静态成员函数和静态数据成员
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。 静态数据成员的用途之一是统计有多少个对象实际存在。 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝原创 2014-08-05 22:47:10 · 2368 阅读 · 1 评论 -
bitset的使用方法
bitset用法有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件。在本书提供的例子中,假设都使用了std::bitset的using声明:#includeusingstd::bitset;bi原创 2014-09-18 08:26:43 · 2589 阅读 · 0 评论 -
C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。原创 2014-08-09 09:33:06 · 1930 阅读 · 0 评论 -
构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
一、构造函数为什么不能为虚函数1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函原创 2014-08-09 09:37:26 · 1414 阅读 · 0 评论 -
C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast
1、const_cast通常被用来将对象的常量刑转换,它也是唯一有此能力的C++-style转型操作符。2、dynamic_cast主要用来执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个实现。他是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。3、reinterpret_case意图执行低级转型,实际动作(及结果)可能取决于编译器,这也就表示它不可原创 2014-07-04 15:36:51 · 1348 阅读 · 0 评论 -
C++运算符优先级
PrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operat原创 2014-08-22 17:42:21 · 1181 阅读 · 0 评论 -
C++中顶层const和底层const
1. 顶层 const 与底层 const 概念 指针本身是一个对象,因为,指针实际对应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个完全不同的概念, 顶层 const 表示的是 指针本身是一个常量, 底层 const 表示的是 指针所指的对象是一个常量,更一般情况下, 顶层 const 可以表示任意对象是一个常原创 2014-08-09 11:10:46 · 5540 阅读 · 1 评论 -
C++中的左值右值
对于 C++ 中的左值和右值,我们通常的说法是:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置),这句话来自于 《C++ Primer 第五版》 第 121 页,那么,对于这句话,该作何理解呢?下面我想来谈谈我的看法:ISO C++03规定表达式必须是左值或右值之一,而在ISO C++11中,左值性被正式地扩充为更复杂的值类原创 2014-08-09 15:05:35 · 1019 阅读 · 0 评论 -
STL中基本的算法(一)
一。replace() 替换算法将指定元素值替换为新值,使用原型如下,将迭代器[first,last)中值为old_value的元素全部替换为new_value值。函数原型:template class ForwardIterator, class T > void replace ( ForwardIterator first, ForwardIterato原创 2014-08-10 16:40:50 · 893 阅读 · 0 评论 -
编译器合成复制构造函数
定义: 只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。使用方式:(1)显示使用----用一个同类型的对象初始化该对象时;(2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。三种类型的复制构造函数:*bitwise copy constructor :逐位复制-----默认方式*合成的 co原创 2014-08-24 09:21:22 · 1447 阅读 · 0 评论 -
Data 语意学---Data member的存取效率
《深度探索C++对象模型》对于data member来说,有两种情况static data member数据 每一个static data member只有一个实体,存放在程序的data segment之中,无论以何种方式,无论类的继承关系如何复杂,存取路径都是非常直接Nonstatic data members 直接存放在一个class obje原创 2014-08-24 11:33:55 · 955 阅读 · 0 评论 -
深度探索C++对象模型-语意学
有三种情况,会以一个object的内容作为另一个class object的初值: Cpp代码 class X { ... }; X x; X xx = x; // 情况1,赋值对象 extern void foo( X x); void bar() { X xx;原创 2014-08-24 10:24:45 · 1003 阅读 · 0 评论 -
C++构造函数语意学--编译器在哪些情况合成default constructot
C++新手常有的误解:C++新手一般有两个常见的误解:1.任何class如果没有定义default constructor,就会被合成出一个来。2.编译器合成出来的default constructor会显示设定“class 内每一个data member的默认值” 有四种情况,会导致“编译器必须为未声明的constructor之classes合成一个defaultco原创 2014-08-23 16:04:45 · 1487 阅读 · 0 评论 -
构造、解构、拷贝语意学
如果一个class已经有了bitwise copy语意,所以implict copy assignment operator被视为毫无用处,也根本不会被合成出来,这一点和copy constructor一样的一个 class对于默认的copy assignment operator,在以下情况下不会表现出bitwise copy语意1、当class内带一个member object,而其c原创 2014-08-25 11:07:29 · 981 阅读 · 0 评论 -
C++中const的使用方法
------------- const指针、const引用、const引用形参 --------------------【1】const修饰指针和引用1. 术语“const引用”就是“指向const对象的引用”,习惯说成const引用与非const引用。这点与指针不同,指针中“const指针”与“指向const对象的指针”是不同的。2. 值得注意的是:const引用和指向const对象原创 2014-08-13 09:40:19 · 1249 阅读 · 0 评论 -
C++中stringstream ostringstream istringstream使用方式
C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。 istringstream类用于执行C++风格的串流的输入操作。 ostringstream类用于执行C风格的串流的输出操作。 strstream类同时可以支持C风格的串流的输入输出操作。 istringstre原创 2014-08-12 21:41:48 · 2097 阅读 · 0 评论 -
STL源码分析--空间配置器 第一级配置器
一、SGI STL配置器简介SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写:[cpp] view plaincopyprint?vectorint,std::alloc> iv; 他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。SGI S原创 2014-08-26 09:53:44 · 993 阅读 · 0 评论 -
STL源码分析--第二级空间配置器
本文讲解SGI STL空间配置器的第二级配置器。相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片。不仅仅是碎片的问题,配置时的额外负担也是一个大问题。因为区块越小,额外负担所占的比例就越大。额外负担是指动态分配内存块的时候,位于其头部的额外信息,包括记录内存块大小的信息以及内存保护区(判断是否越界)。要想了解详细信息,请参考MSVC或者其他malloc实现。原创 2014-08-26 09:54:52 · 1667 阅读 · 0 评论 -
STL源码分析--萃取编程(traits)技术的实现
1.为什么要出现?按照默认认定,一个模板给出了一个单一的定义,可以用于用户可以想到的任何模板参数!但是对于写模板的人而言,这种方式并不灵活,特别是遇到模板参数为指针时,若想实现与类型的参量不一样的实例化,就变得不太可能了!也有时,想禁止此种相同的实例化变得不太可能!故而出现了,Partial Specialization!同时,在使用void*指针时,可以最大限度的共享代码,减少代码的膨胀原创 2014-08-27 10:25:20 · 3745 阅读 · 2 评论 -
前置后置自增自减操作
class Int{ friend ostream& operator<<(ostream& os, const Int& i); friend istream& operator>>(istream& is, Int& i); friend bool operator<(const Int& a, const Int& b);private: int value;public:原创 2014-08-12 21:17:12 · 1183 阅读 · 0 评论 -
STL源码分析--迭代器总结、迭代器失效总结
Vector1、内部数据结构:连续存储,例如数组。2、随机访问每个元素,所需要的时间为常量。3、在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。5、迭代器失效插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该原创 2014-08-27 22:12:22 · 1135 阅读 · 0 评论 -
STL源码分析--list中的sort算法
STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序,代码长度到不长,但真是难以读懂,后来扣持了一下午终于搞明白了,贴个总结上来。list::sort的代码如下(sgi stl):[cpp] view plai转载 2014-08-27 19:58:38 · 1354 阅读 · 0 评论 -
STL源码分析--list
相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。 list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto原创 2014-08-27 20:16:09 · 1304 阅读 · 3 评论 -
STL源码分析--deque
一、deque的中控器 deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector。array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是个假象,事实上是(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂。原创 2014-08-27 21:59:25 · 1131 阅读 · 0 评论 -
为什么通过空指针(NULL)可以正确调用类的部分成员函数
#include using namespace std;class B {public: void foo() { cout << "B foo " << endl; } void pp() { cout << "B pp" << endl; } void FunctionB() { cout << "funB" << endl; }};int main(原创 2014-08-14 10:51:17 · 1795 阅读 · 0 评论 -
STL源码分析--向量(vector)的实现
vector容器概述 vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,原创 2014-08-10 15:17:18 · 813 阅读 · 0 评论 -
C++虚函数需要注意的几个地方
一、通过父类型的指针访问子类自己的虚函数我们知道,子类没有重载父类的虚函数是一件毫无意义的事情。因为多态也是要基于函数重载的。虽然在上面的图中我们可以看到Base1的虚表中有Derive的虚函数,但我们根本不可能使用下面的语句来调用子类的自有虚函数:Base1 *b1 = new Derive();b1->g1(); //编译出错任何妄图使用父类指针想调用子类中的未覆盖父类的成转载 2014-09-22 20:05:34 · 938 阅读 · 0 评论