随笔分类 -  C/C++

线程互斥与析构函数中mutex的销毁
摘要:正在实现一个线程池的pthread包装器,突然发现有人在讨论关于http://blog.csdn.net/Solstice/article/details/5238671 是一篇比较老的文章,考虑了下 我在实现线程池包装器的时候会不会出现文章说的析构函数销毁mutex的问题最后得出一个结论 在线程池... 阅读全文

posted @ 2014-11-17 14:34 as_ 阅读(2266) 评论(0) 推荐(0) 编辑

C++:vector中的resize()函数 VS reserve()函数
摘要:http://www.cplusplus.com/reference/vector/vector/vector/写代码的时候无意错用了这两个函数 导致测试的时候,程序运行崩溃 发现这两个函数还是有区别的void reserve (size_type n);reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存capacity的值会大于或者等于n 。这样,当ector调用push_back函数使得siz 阅读全文

posted @ 2013-05-11 17:01 as_ 阅读(60633) 评论(0) 推荐(0) 编辑

C++ 虚继承
摘要:转自:http://www.cppblog.com/chemz/archive/2007/06/12/26135.html虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。 首先还是先给出虚继承和虚基类的定义。 虚继承:在继承定义中包含了virtual关键字的继承关系; 虚基类:在虚继承体系 阅读全文

posted @ 2012-11-12 14:38 as_ 阅读(2530) 评论(0) 推荐(0) 编辑

C++深拷贝与浅拷贝
摘要:转自:http://www.cnblogs.com/BlueTzar/articles/1223313.html对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostream> using namespace std; class CExample { private: int a; public: CExample(int b) { a=b; } void Show... 阅读全文

posted @ 2012-11-02 14:53 as_ 阅读(3724) 评论(0) 推荐(0) 编辑

值 引用 指针概念区别汇总
摘要:传值和传引用的概念传值(pass by value):即形参接收实参传递过来的值,如果是自定义类型,要调用拷贝构造函数。函数处理的是形参的值。传引用(pass by reference):引用表示与原对象完全相同,是同一个对象。若函数的形参是引用,则实参与形参间不存在参数传递,且函数内对形参的修改就是修改实参,因为它们是引用关系,是同一个对象。语言应用C语言中,传递的参数类型只有1个:传值,包括传递普通数值和指针。C++中,传递的参数类型有2个:传值、传引用java中,传递的类型只有1个:传值。java中传的值包括:基本数据类型和对象,其中对象当做指针看待三种语言的处理方法相同: 不管传递的是 阅读全文

posted @ 2012-10-11 13:52 as_ 阅读(650) 评论(0) 推荐(0) 编辑

静态编译和动态编译(函数)实现
摘要:资料来源于网络在C++中,联编是指一个计算机程序的不同部分彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。1.静态联编静态联编是指联编工作在编译阶段完成的,这种联编过程是在程序运行之前完成的,又称为早期联编。要实现静态联编,在编译阶段就必须确定程序中的操作调用(如函数调用)与执行该操作代码间的关系,确定这种关系称为束定,在编译时的束定称为静态束定。静态联编对函数的选择是基于指向对象的指针或者引用的类型。其优点是效率高,但灵活性差.2.动态联编动态联编是指联编在程序运行时动态地进行,根据当时的情况来确定调用哪个同名函数,实际上是在运行时虚函数的实现。这种联 阅读全文

posted @ 2012-10-09 10:12 as_ 阅读(2535) 评论(0) 推荐(0) 编辑

const与define的对比
摘要:define常见用法:1.定义简单的常数:定义常量,便于修改(切不可在后面加上分号!)#define N 1000等效于const int N = 1000;但略有不同,define只是简单替换,而不是作为一个变量来使用.2. 定义简单的函数:注意多使用括号 define可以像函数那样接受一些参数,如下:#define max(x,y) (x)>(y)?(x):(y);3.条件编译(防止重复包括 重复定义)4.定义单行宏,多行宏与const比较部分const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而#define 只作简单的字符串替换,无类型安全检查。co 阅读全文

posted @ 2012-10-09 09:56 as_ 阅读(1519) 评论(0) 推荐(1) 编辑

C++ STL中的vector的内存分配与释放
摘要:1.vector的内存增长vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。在调用push_back时,每次执行push_back操作,相 阅读全文

posted @ 2012-09-12 15:57 as_ 阅读(90665) 评论(10) 推荐(7) 编辑

Effective C++条款37:绝不重新定义继承而来的缺省参数值
摘要:要点:绝对不要重新定义一个继承而来的缺省参数,因为缺省参数都是静态绑定,而virtual函数――你唯一应该覆写的东西――却是动态绑定。virtual函数是动态绑定的,而缺省参数却是静态绑定,对象的所谓静态类型,是它在程序中被声明时所采用的类型。class Shape { public: enum ShapeColor {Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; }; class Rectangle : public Shape { public: //赋予不同的缺省参数... 阅读全文

posted @ 2012-09-07 15:26 as_ 阅读(785) 评论(0) 推荐(0) 编辑

C/C++ struct/class/union内存对齐
摘要:struct/class/union内存对齐原则有四个:1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b 阅读全文

posted @ 2012-09-07 14:15 as_ 阅读(3315) 评论(0) 推荐(1) 编辑

C++之对象切割
摘要:问题描述程序如下:#include <iostream>#include <cstdlib>using namespace std;class Base{ public: virtual void fun() { cout << "Base fun() is Called" << endl; }};class Derived:public Base{ public: void fun() { ... 阅读全文

posted @ 2012-09-07 13:07 as_ 阅读(2399) 评论(0) 推荐(0) 编辑

C语言的数组的地址
摘要:问题描述:有如下程序:#include<stdio.h>int main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a + 1); printf("%d %d\n", *(a + 1), *(ptr-1)); return 0;}输出结果:2 5原因解释:*(a+1) 因为a的地址为数组a第一个元素的地址,所以a+1就是a的第二个元素的地址 输出为2&a的类型是int[5],则&a+1的偏移量为整个数组a的大小 换句话说它也表示了该数组最后一个元素的下一个地址,上面的ptr则是一 阅读全文

posted @ 2012-09-07 12:19 as_ 阅读(563) 评论(0) 推荐(1) 编辑

Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value
摘要:要点:尽量以pass-by-reference-to-const替换pass-by-value,这通常比较高效,并可避免由子类对象拷贝成基类时的对象切割问题对于内值类型、STL迭代器和函数对象应该采用pass-by-value的形式。缺省情况下c++以by value 的方式传递对象(或来自)函数。函数参数是以实参的副本为初值,用函数获得的也是函数返回值的一个副本 这些副本由对象的copy构造函数产出,这可能使得pass-by-value成为昂贵的操作:class Person { public: Person(); virtual ~Person(); protected: ... 阅读全文

posted @ 2012-09-02 20:15 as_ 阅读(576) 评论(0) 推荐(0) 编辑

Effective C++条款9:绝不在构造和析构函数过程中调用virtual函数
摘要:要点:不该在构造函数和析构函数期间调用virtual函数class Transaction //所有交易的基类 {public: Transaction(); virtual void logTransaction() const = 0;//做出一份因类型不同而不同 //的日志记录 }; Transaction::Transaction() //基类构造函数的实现 { l... 阅读全文

posted @ 2012-09-02 19:21 as_ 阅读(958) 评论(0) 推荐(0) 编辑

Effective C++条款7:为多态基类声明virtual析构函数
摘要:要点:带多态性质的基类或者class中有virtual函数,就应该将析构函数声明为virtual,例如class TimeKeeper{public: TimeKeeper(); ~TimeKeeper();};class AtomicClck : public TimeKeeper //原子钟 { }; class WaterClck : public TimeKeeper //水钟 { }; class WristClck : public TimeKeeper //腕表 { };int main(){ TimeKeeper * ptk = getTi... 阅读全文

posted @ 2012-09-02 15:49 as_ 阅读(316) 评论(0) 推荐(0) 编辑

Effective C++条款4:确认对象钱已经被初始化
摘要:要点:构造函数内赋值和使用初始化列表区别在于1).因为const成员只能被初始化,不能被赋值,所以必须利用构造函数初始化列表进行初始化 eg:class Point { public: Point():_x(0),_y(0){}; Point( int x, int y ):_x(x),_y(y){} //Point(){ _x = 0; _y = 0;} 错误 //Point( int x, int y ){ _x = 0; _y = 0; } 错误private: const int ... 阅读全文

posted @ 2012-09-02 10:41 as_ 阅读(366) 评论(0) 推荐(0) 编辑

C++ 重载、覆盖和隐藏
摘要:1.重载 所谓函数重载是指同一个函数名可以对应着多个函数的实现。例如,可以给函数名add()定义多个函数实现,该函数的功能是求和,即求两个操作数的和。其中,一个函数实现是求两个int型数之和,另一个实现是求两个浮点型数之和,再一个实现是求两个复数的和。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。这就是函数重载的概念。函数重载在类和对象的应用尤其重要。 函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则 阅读全文

posted @ 2012-07-24 20:43 as_ 阅读(765) 评论(0) 推荐(0) 编辑

C语言中的itoa和atoi函数的实现
摘要:itoa与atoi的代码实现:int atoi(char *str){ char *p=str; switch(*p) { case '+': p++;break; case '-': p++;break; default: break; } if(!(*p>='0' && *p<='9')) { printf("format error"); return 0; } int res... 阅读全文

posted @ 2012-07-22 14:39 as_ 阅读(3928) 评论(0) 推荐(1) 编辑

C++ STL 一般总结
摘要:以下内容来源网上 经过整合而成一、一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。 从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念( 阅读全文

posted @ 2012-07-22 11:04 as_ 阅读(80520) 评论(3) 推荐(25) 编辑

函数指针和指针函数
摘要:函数指针一、基本内容函数指针是指向函数的指针变量 .因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为: 函数类型(指针变量名)(形参列表);说明:1.“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形. 阅读全文

posted @ 2012-07-21 16:36 as_ 阅读(1408) 评论(0) 推荐(1) 编辑

导航