2010年6月22日
摘要: 预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。 #include 指令有两种使用形式 #include <stdio.h> 文件名放在尖括号中 #include “mystuff.h” 文件名放... 阅读全文
posted @ 2010-06-22 18:23 chao_yu 阅读(1546) 评论(0) 推荐(0) 编辑
摘要: 1. 深层揭密extern "C" extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。(1)被extern "C"限定的函数或变量是extern 类型的; extern 是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字... 阅读全文
posted @ 2010-06-22 15:48 chao_yu 阅读(848) 评论(0) 推荐(0) 编辑
2010年6月21日
摘要: 进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法得知那个线程会先运行,哪个线程会后运行。下面介绍一些技术,通过他们,你会合理安排你的线程之间对资源的竞争。(1) 互斥体Mutex(2) 信号灯Semophore(3) 条件变量Conditions1. 先说一下互斥量。什么时候会用上互斥量了?比如你现在有一全局链表,你有几个工作线程。每一个线程从该... 阅读全文
posted @ 2010-06-21 16:29 chao_yu 阅读(4225) 评论(1) 推荐(1) 编辑
摘要: 先贴示范代码://--------------------tmutex.h开始------------------------------//实现linux的互斥量c++封装#ifndef TMUTEX_H#define TMUTEX_H#include <pthread.h>//线程互斥量struct ThreadMutex{ ThreadMutex() { pthread_mute... 阅读全文
posted @ 2010-06-21 10:26 chao_yu 阅读(3341) 评论(0) 推荐(0) 编辑
2010年6月18日
摘要: c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class MyClass{public:MyClass( int num );}....MyClass obj = ... 阅读全文
posted @ 2010-06-18 17:46 chao_yu 阅读(461) 评论(0) 推荐(0) 编辑
摘要: 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和... 阅读全文
posted @ 2010-06-18 17:40 chao_yu 阅读(1082) 评论(0) 推荐(0) 编辑
摘要: 本文引入作者Paul S. R. Chisholm关于Pure Virtual Function Called问题的深入见解,要说明的是翻译部分对原文进行了删减,很遗憾的去除了作者一些幽默风格的解说,直截了当地说明问题。面向对象 C++: 程序员的观点 在C++中,虚函数允许关联类实例在运行时拥有不同的行为(也称作运行时多态):class Shape {public:virtual double... 阅读全文
posted @ 2010-06-18 14:36 chao_yu 阅读(1139) 评论(0) 推荐(0) 编辑
摘要: 在C++中,存在类型转换,通常意味着存在缺陷(并非绝对)。所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换。在C+... 阅读全文
posted @ 2010-06-18 11:47 chao_yu 阅读(2344) 评论(0) 推荐(0) 编辑
摘要: 昨天在针对webcore中TimerBase的堆操作部分进行修改,目的在于解决切台死机的问题时引发了这个新问题,通过查找目前提到的最多的原因有两种:(1)在基类的构造函数或析构函数中直接或间接的调用纯虚函数(2)通过野指针调用到虚函数并列举如下:针对“在基类的构造函数或析构函数中直接或间接的调用纯虚函数 ”:    class Base{public:Base(){call... 阅读全文
posted @ 2010-06-18 10:59 chao_yu 阅读(3225) 评论(0) 推荐(0) 编辑
2010年6月17日
摘要: 堆排序在最坏的情况下,其时间复杂度也能达到O(nlogn)。相对于快速排序来说,这是它最大的优点,此外,堆排序仅需要一个记录大小供交换用的辅助存储空间。堆排序的数据结构是二叉堆,二叉堆的特点有两个,一个是它是一棵完全二叉树,另一个是它的根结点小于孩子结点,所以我们很容易找到它的最小结点----根结点;当然如果你想找到最大结点的话,那就要扫描所有的叶子结点,这是很费时间的,如果你想找的是最大结点的话... 阅读全文
posted @ 2010-06-17 16:59 chao_yu 阅读(1856) 评论(0) 推荐(1) 编辑