随笔分类 -  C/C++

摘要:宏定义是在程序编译前的预处理阶段,对所有使用到宏的地方进行替换;今天看到代码里面一大推的 #define与#undef的使用,却不甚明白看了好一阵子才弄清楚是干什么的,其实很简单。定义:#define PROCESS_TYPE_DEF_SAME_DELETE() PROCESS_TYPE_BASIC_DEF(UMS_PROCESS_TYPE_SAME_DELETE, same_delete)#define PROCESS_TYPE_DEF_GET_SAME_LIST() PROCESS_TYPE_BASIC_DEF(UMS_PROCESS_TYPE_GET_SAME_L... 阅读全文
posted @ 2012-03-06 19:39 __Shadow 阅读(25733) 评论(0) 推荐(1)
摘要:C++ Event Model一 事件模型 对发生的事件作出的响应——事件模型。1 事件: 在面向对象中,就是对象的属性或者状态发生了变化,操作或者接收到了某些动作时,向外发出了这种变化或者动作对应的通知。 2 事件模型包括的元素: 3 事件模型过程: 二 代码实现1 EventManager/*----------------------------------------------------------------*//* class Object 响应事件函数的类必须是从Object派生下来 *//*-------... 阅读全文
posted @ 2012-01-10 18:49 __Shadow 阅读(22563) 评论(2) 推荐(5)
摘要:一 string与char*比较1 string是一个类,char*是一个指向char型的指针。 string封装了char*,管理这个字符串封装了char*,是一个char*型的容器,使用灵活性强便于功能扩展。2 不用考虑内存释放和越界 String封装了char*,负责管理char*字符串,管理为char*所分配的内存。 每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。3 string支持运算重载运算符: string a;string b;string c; 相加运算: c = a + b ;比较运算:a > b, a != b;4 能提供系 阅读全文
posted @ 2012-01-07 17:52 __Shadow 阅读(5687) 评论(0) 推荐(0)
摘要:问题是这样的:实现框架中类的RTTI需要保存类信息,为每一个要加入到运行时识别的类框架中的类,都创建一个存储类信息的classInfo类对象,内存使用的是静态数据区的类中静态数组。静态数组的大小是:U32 _className::s_classInfoBuf[(sizeof(ClassInfo) + sizeof(U32) - 1) / sizeof(U32)];new (s_classInfoBuf) ClassInfo();这个数组的大小 = (sizeof(ClassInfo) + sizeof(U32) - 1) / sizeof(U32) 着实让我看了很久没有弄明白。类的大小到底怎么 阅读全文
posted @ 2012-01-03 18:17 __Shadow 阅读(852) 评论(0) 推荐(0)
摘要:实在惭愧,想要申请指向一个类的连续的批量的内存,尽然不知道怎么申请……1 基本类型的申请 //申请连续的10个指向int类型内存 int *pArray = new int(10);2 结构体和类class A{public: A(int a){}private: int x;};//申请10个连续的指向A对象的内存pA = new A[10]; //error 无默认构造函数pA = new A[10](0); //error 不支持class A{public: A(){} A(int a... 阅读全文
posted @ 2011-12-25 15:14 __Shadow 阅读(1844) 评论(0) 推荐(0)
摘要:static_cast与dynamic_cast转换 一 C语言中存在着两种类型转换:隐式转换和显式转换隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成char ch;int i = ch;显示转换:在类型前增加 :(Type)变量 对变量进行的转换。用户显式增加char *pc = (char*)pb;void *ps = (void*)pa;二 C++中的类型转换 通过这两种方式,C语言中大部分的类型转换都可以顺利进行。至于能不能进行转换,转换后的结果如何,编译器不管需要用户自己去控制。 C++继承了C中的隐式和显式转换的方式。但这... 阅读全文
posted @ 2011-12-14 21:49 __Shadow 阅读(29947) 评论(2) 推荐(4)
摘要:内存管理与智能指针 C++中不具备对内存的自动管理机制,垃圾回收机制。内存管理是一件复杂的事情和重要的事情,面对庞大的对象群,复杂的逻辑,甚至多线程中,是不能保证对象的每一次使用都正确,申请的内存都能被合理的释放。但是又必须确保这件事情的正确执行,否则系统将无法正常的工作。 最近在学习平台上的一些感觉非常棒的设计方法和机制的应用,结果却不断的发现有太多的基于C++基础如模板,指针,虚函数等应用,而我却不甚理解,也感觉到C++这门语言是何其强大和深奥,不是学会了语法就能掌握的,灵活的应用才是最困难的和不易掌握的。 本篇将简单探究一下C++中所谓的智能指针问题。一 Boo... 阅读全文
posted @ 2011-12-12 21:10 __Shadow 阅读(3272) 评论(0) 推荐(2)
摘要:一 函数指针 函数指针就是一个指向函数起始地址的指针变量。二 普通函数指针 C/C++语言中,函数相当于汇编中的参数入栈和调用proc,函数就是将这两个过程封装起来。函数名就代表函数的起始地址。要调用这个函数,就要找到对应的起始地址。有了起始地址就可进入带函数体中执行代码。下面看几个例子:typedef void (*Ps_Func0)(void); //指向返回值为void和无参的函数typedef void (*Ps_Func1)(int); //指向返回值为void和参数为int的函数typedef void (*Ps_Func2)(int,int); ... 阅读全文
posted @ 2011-12-12 19:01 __Shadow 阅读(1256) 评论(0) 推荐(0)
摘要:C++类中成员变量的初始化有两种方式: 构造函数初始化列表和构造函数体内赋值。下面看看两种方式有何不同。 成员变量初始化的顺序是按照在那种定义的顺序。1 内部数据类型(char,int……指针等)class Animal{public: Animal(int weight,int height): //A初始化列表 m_weight(weight), m_height(height) { } Animal(int weight,int height) //B函数体内初始化 { m_weight = weig... 阅读全文
posted @ 2011-12-08 20:36 __Shadow 阅读(48885) 评论(2) 推荐(8)
摘要:析构函数 Destructor 当一个对象的生命周期结束(超出范围或者主动释放)时, 调用对象的析构函数来回收其所占用的存储空间(对象,动态内存等)和资源(信号量,互斥锁等)。一 普通虚构函数class ConcreateObject: public object{public: ~ConcreateObject();};//使用 范围{ ConcreateObject cObj;} ------------->//cObj生命结束 析构函数被调用 ~ConcreateObject()//手动释放ConcreateObject *pCObj = new ConcreateO... 阅读全文
posted @ 2011-12-05 19:07 __Shadow 阅读(1565) 评论(0) 推荐(0)
摘要:Templates定义一个模板使用的关键字:class和typename。在定义作为模板的时候:class和typename,作用是一样的出处:http://www.cplusplus.com/doc/tutorial/templates/一 函数模板1 定义方式template <class identifier> function_declaration; template <typename identifier> function_declaration;2 Exampletemplate <class T>T GetMax (T a, T b){ 阅读全文
posted @ 2011-12-01 22:13 __Shadow 阅读(612) 评论(0) 推荐(0)
摘要:宏定义中使用do{}while(0)的好处#define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:#define foo(x) /action1(); /action2();在以下情况下:if(NULL == pPointer) foo();就会出现action1和action2... 阅读全文
posted @ 2011-11-24 19:47 __Shadow 阅读(6693) 评论(0) 推荐(1)