C/C++
文章平均质量分 76
漫步者、
从事游戏开发者
展开
-
终止线程两个函数:ExitThread() 和 TerminateThread()
若要终止线程的运行,可以使用下面四种的方法:线程函数退出循环来返回 (最佳方法 )。通过调用ExitThread 函数,线程将自行撤消(尽量不要使用这种方法 )。同一个进程或另一个进程中的线程调用TerminateThread 函数(最好避免使用这种方法 )。该线程的主进程终止运行(避免使用 )。下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。1转载 2012-09-02 09:59:02 · 14061 阅读 · 0 评论 -
C++拷贝函数详解
1.什么是拷贝构造函数:CA(const CA& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就转载 2012-09-07 23:27:18 · 2708 阅读 · 0 评论 -
HeapAlloc,GlobalAlloc,LocalAlloc,VirtualAlloc,malloc,new的异同
1. 首先我们来看HeapAlloc:MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是局部。函数原型为:LPVOIDHeapAlloc( HA转载 2012-10-01 14:32:02 · 789 阅读 · 0 评论 -
类的数据成员初始化
class A{private:static int a;static const int b;static const int c=12;static const double d;char f;};在一个类中,数据成员的初始化: 一般的数据成员或者常量数据都是通过构造函数来实现初始化,然而对于静态数据(指的是非const类型)初始化,都是在类的定义外部类初始化,例如calss原创 2012-10-05 20:56:46 · 849 阅读 · 0 评论 -
共用体详解
共用体同结构体的定义形式上相同,只是把关键字struct改为union。有时需要把几种不同类型的变量放在同有一内存区域中,见图12-6,把一个整型变量,一个字符变量,一个实型变量放在同一内存区域中,尽管三个变量占用字节数各不相同,但起始地址都一样(例如1000)它要用“覆盖’’技术,使多个变量互相覆盖。这种结构称为共同体或者联合。原创 2012-10-06 21:55:44 · 1395 阅读 · 0 评论 -
静态链接库与动态链接库的区别
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可原创 2012-10-07 00:09:57 · 520 阅读 · 0 评论 -
static 声明的变量在C语言中有两方面的特征
1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改原创 2012-10-11 07:00:52 · 1134 阅读 · 0 评论 -
构造函数能不能是虚函数
解释一下: 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2,从使用角度 虚函数主要用于在信息不全的情况下,能使重载原创 2012-10-10 10:53:39 · 653 阅读 · 1 评论 -
typeid使用
在c++中,typeid用于获知一个变量的具体类型。(注意:typeid是操作符,不是函数!) 运行时获知变量类型名称,可以使用 typeid(变量).name,需要注意不是所有编译器都输出"int"、"float"等之类的名称,对于这类的编译器可以这样使用:float f = 1.1f; if( typeid(f) == typeid(0.0f) ) …… 事例代码:原创 2012-10-13 10:22:30 · 646 阅读 · 0 评论 -
const 关键字 笔记
const修饰的值并不是常量,而是只读的变量。其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。C++ 里 const 变量一般默认 static 连接方式也就是其它 .cpp 文件看不到,所以用 extern 声明也没用可将 const 变量的声明放在 .h 文件里,需要使用此常量的 .cpp 都 #include 它编译器通常不为普通const只读变原创 2012-10-17 12:58:33 · 707 阅读 · 0 评论 -
c++的POD类型详解
POD(plain old data)在imperfect c++里,书里是这样解释POD的:1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版本都是POD类型。2、 POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer to class member、原创 2012-10-18 12:45:03 · 1034 阅读 · 0 评论 -
C++如何写一个简单的DLL文件
这个东西其实挺简单的,刚开始写的时候,是在VC的编译器上,按照前人的步骤,老失败,折腾我一天了,结果,我换了个编译器,在vs08的平台上,就成功了,好了,不多少了,分享一下:首先建立一个MyDll的win32 项目中建立一个DLL类型的工程,然后创建一个CPP文件,取名MyDll,内容如下:extern "C" __declspec(dllexport) int add(int a,int原创 2012-12-09 20:02:45 · 15695 阅读 · 1 评论 -
MFC实现文件下载和上传
#include "stdafx.h"#include "afxinet.h"#include "afxwin.h"#pragma comment(lib,"Wininet.lib")BOOL UploadFile(LPCTSTR strURL, //负责接收上传操作的页面的URL LPCTSTR strLocalFileName) //待上传的本地文件路原创 2013-02-20 16:24:53 · 3069 阅读 · 1 评论 -
合成构造函数
如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数。通常我们认为如果一个class没有构造函数,编译器就会为我们合成一个,其实这种观点是不正确的。比如像下面这样的class:class Person { int age; char *name;};编译器根本就没有必要合成一个default constru原创 2013-02-21 22:52:16 · 1093 阅读 · 0 评论 -
多线程同步、异步
1、首先明确一点,对于单核CPU,任意一个时刻只有一个线程在运行。那么既然这样,多线程还有什么意义呢? 举例来说,现在只有一个人,要做好几个任务。单线程就是,任务一个一个地做,必须做完一个任务后,再去做另一个任务。多线程就是一会做这个任务,一会做那个任务,每个任务做一会,不停的切换。显然,最后把所有的任务做完,多线程必定比单线程更耗费时间。为什么?因为,多线程要在不同的任务之间切换,切换肯定是要耗原创 2013-03-08 16:20:33 · 3325 阅读 · 0 评论 -
MFC关键技术之仿真(DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC)
MFC.h#ifndef __MFC_H_#define __MFC_H_#define BOOL int#define TRUE 1#define FALSE 0#define LPCSTR LPSTRtypedef char* LPSTR;#define UINT int#define PASCAL _stdcall#include class CObject;st原创 2013-03-14 21:24:09 · 2051 阅读 · 0 评论 -
设计模式之Builder模式
Builder模式的关键是其中的Director对象并不直接返回对象,而是通过一步步来一步步进行对象的创建。当然这里Director可以提供一个默认的返回对象的接口(即返回通用的复杂对象的创建,即不指定或者特定唯一指定BuilderProduct*中的参数)。 Product.h#ifndef _PRODUCT_H_#define _PRODUCT_H_class CProduct{原创 2013-03-20 11:08:09 · 677 阅读 · 0 评论 -
设计模式之Prototype模式
关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的3根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时原创 2013-03-20 16:02:59 · 754 阅读 · 0 评论 -
Virtual 关键字,派生类重写父类的方法
定义C++中虚函数的关键字在使用virtual之前,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(引用百科)。 我们通常用virtual 关键字来修饰类方法,让其派生类或子类有重写该方法。我们来看个例子:#include class BaseImp{public: BaseImp(){原创 2013-10-14 09:59:46 · 5079 阅读 · 0 评论 -
C/C++编程规范
目 录一、 文件结构1.1 版权和版本的声明1.2 头文件的结构1.3 定义文件的结构二、文件的版式2.1 空行的用法2.2 代码行2.3 代码行内的空格2.4 对齐2.5 长行拆分2.6 修饰符的位置2.7 注释三、命名规则3.1 命名基本规则四、表达式和基本语句4.1 运算符的优先级4.2 复合表达式4.3 if 语原创 2013-10-19 07:06:38 · 843 阅读 · 0 评论 -
operator <<重载
#include template class MyTemplateClass{public : friend void Counts(); friend void Reports(const MyTemplateClass &r_TemplateClass) ; template friend std::ostream& operator &r原创 2013-10-22 14:25:17 · 1040 阅读 · 0 评论 -
自己动手写的allocate,还有待完善
/**Version:1*Date: 10/23*CopyRight:pjGan*/#ifndef DEFINE_DATA#define DEFINE_DATA#include #include #include #include #include namespace MyAllocateSpace{ template inline T* _alloca原创 2013-10-23 16:32:32 · 832 阅读 · 0 评论 -
多线程Mutex'sExample
/**Date:31/oct/2013*Author:pjgan*Complier:VC++2008*Theme: Study the Thread,the example is to sell the tickets;*/CRITICAL_SECTION g_cs;bool g_isSellOut = false;HANDLE hMutex; DWORD WINAPI Th原创 2013-10-31 16:04:33 · 868 阅读 · 0 评论 -
多线程Event的使用例子
#include #include #include DWORD WINAPI Thread1Proc(LPVOID lpParameter); DWORD WINAPI Thread2Proc(LPVOID lpParameter);/**Date:31/oct/2013*Author:pjgan*Complier:VC++2008*Theme: Study the Thr原创 2013-10-31 15:34:07 · 979 阅读 · 0 评论 -
lua 之弱引用
一个table的弱引用类型是通过其元素表中的__mode字段来决定的,这个字段的值应为一个字符串,如果这个字符串中包含字母'k'/'v'那么这个table 的value是弱引用,代码如下:key = {}a[key] = 1key = {}a[key] = 2collectgarbage() --强制进行一次垃圾收集for k, k in pairs(a) do print(v)原创 2013-11-15 11:12:37 · 3606 阅读 · 0 评论 -
Lua之变量环境
在lua定义的全局变量都存table中,这个table放在空间_G里面,和C/C++里面的namespace 一样,我们通过代码来解释吧!a = 1local b = 3local newg = {}setmetatable(newg, {__index = _G})//绑定到newg新的table 空间中setfenv(1, newg)//改变环境,设定到newga = 10pr原创 2013-11-14 17:15:05 · 1585 阅读 · 0 评论 -
自己封装的简单多线程
写了个简单的多线程,我将它封装到自己的类里面!/**Date:1/Nov/2013*Author:pjgan*Complier:VC++2008*/#ifndef TICKER_H#define TICKER_H/*include the system head files*/#include #include #include /**sell the tic原创 2013-11-01 12:10:51 · 723 阅读 · 0 评论 -
lua之字符串格式化
a = 'aadsdf\"'print(string.format("%q",a))%d十进制整数%o八进制整数%x十六进制整数,大写的话为 %X%f浮点型 格式 [-]nnnn.nnnn%e科学表示法 格式 [-]n.nnnn e [+|-]nnn, 大写的话为 %E%gfloating-point as %e if exp. = precis原创 2013-11-14 22:26:43 · 32806 阅读 · 0 评论 -
lua 与VC环境配置
一下就是LUA的开发环境。如果你是个C/C++程序员,用的是VS。本人用的是VS2008。有点怀旧了,忍忍!选择“Tools(工具)”-->“Options(选项)”-->“Projects and Solutions(项目和解决方案)”-->“VC++ Directories(C++目录)”。(1)在右边的“Show Directories for(显示目录)”中的下拉菜单中选择“I原创 2013-11-15 15:51:57 · 1831 阅读 · 0 评论 -
多线程讲解
临界区(Critical Section) 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语原创 2013-11-01 22:14:48 · 550 阅读 · 0 评论 -
如何配置cocos2dx在vs2010的环境
刚开始在上网查找了一些相关资料,自己也下了cocos2dx,在下完后,就开始配置环境了,按照网上有经验的人的做法配置,先是把下下来的工程(选择你当前的vs版本)运行一下,估计要一个小时(我运行的时候是要了一个小时),目的是为了生成lib,dll文件,在生成之后,你最好是把lib,dll文件分别拿出来,新建两个文件Dlls,Libs,分别放入进去,然后就要开始配置vs的配置文件路径了:如图:原创 2013-11-13 00:44:48 · 9010 阅读 · 2 评论 -
静态成员函数
今天一了一段很基础的代码,用到了static 类成员函数,在测试的过程中发现它是可以通过某个对象去访问它的私有数据! 做一个代码测试: CMyThread *pThread = static_cast(pParam); CTask *pTask = pThread->m_pTask;//在以前的测试过程中,我知道它(static 成员函数)是原创 2013-11-04 16:00:38 · 672 阅读 · 0 评论 -
两个已排序的数组进行合并
描述: 该程序是按照从小到大的顺序进行排序,代码如下:#include #include /**Describe:print the elements of the array*/void Global_printElements(const int *pArray,int Array_Length);/**Return: true is sorted**/b原创 2013-11-05 16:23:57 · 787 阅读 · 0 评论 -
cocos2dx之背景Fade in/out
在cocos2dx中,如果我们直接切换背景的话,我们直接使用:CCDirector::sharedDirector()->replaceScene(pScene);但是有时候,我们希望在切换背景的时候尽情fade in/out,这个时候我们需要用CCTransitionFade这个类,它继承了CCTransitionScene,我们来看一下如何切换背景时,进行fade in/out:原创 2013-11-18 17:12:46 · 3365 阅读 · 0 评论 -
面向对象设计之接口分离原则
在这里就采用多重继承来解决,代码如下:#include class Door {public: virtual void Lock() const = 0; virtual void Unlock() const = 0;};class Alaram {public: virtual void setAalram() const = 0;};原创 2013-11-06 10:16:58 · 1705 阅读 · 0 评论 -
Cocos2dx 之retain ,release
因为功能和接口和objective-c版本的差不多,所以在内存管理上也采用objective-c引用计数的机制来实现内存管理。仔细看了一下cocos2d-x的源代码,确实写的很好,代码组织得很工整。它们所有类都是继承自CCObject, CCObject有retain(), release()和autorelease()等方法,和objective-c上的NSObject用法一致。每当CCObje转载 2013-11-20 17:23:48 · 5841 阅读 · 0 评论 -
cocos2d之,创建一个有背景颜色的layer
创建一个带有背景颜色的Layer,我们需要用到CCLayer的一个派生类CCLayerColor,看如下代码: CCSize s = CCDirector::sharedDirector()->getWinSize(); CCLayer *layer = CCLayerColor::create(ccc4(0xff, 0x00, 0x00, 0x80), 200, 200);原创 2013-11-20 11:02:44 · 17796 阅读 · 0 评论 -
Cocos2dx 之 setBlendFunc
CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案。ccBlendFunc包含了一个src和一个dst,分别表示目标和源的运算因子。 如果我们对一个Sprite使用setBlendFunc方法,如: [Sprite setBlendFunc:(ccBlendFunc){GL_ONE,GL_ZERO转载 2013-11-21 23:25:29 · 15660 阅读 · 0 评论 -
cocos2dx之setTouchesBegan
下面为创建球的例子,目的是为了去点击球体,让就能够获得press的消息,代码如下: for(int i = 0; i < kBallCount; ++i) { CCSprite *sprite_ball = CCSprite::create("MyBall.jpg"); sprite_ball->setTag(i); sprite_ball->setPosition(ccp(原创 2013-11-22 00:13:45 · 1437 阅读 · 0 评论 -
cocos2dx 之如何创建label 做计分板
首先创建label: gameScoreLabel = CCLabelTTF::create("0", "Arial", 30); gameScoreLabel->setColor(ccRED); gameScoreLabel->retain(); gameScoreLabel->setPosition(ccp(s.width / 6, s.height / 6原创 2013-11-22 09:27:44 · 5905 阅读 · 0 评论