C++builder编程总结.doc

一、typedef 定义函数指针类型及用法 typedef可以用于定义函数指针类型: 【语法】typedef 返回类型 (*函数类型名)(参数表) typedef 返回类型 (类名::*函数类型名)(参数表) 【用途】1、可以用来定义该函数类型的函数指针,就不用每次使用函数指针都要写一次函数原型了; 2、有了类型名,就可以使用在容器里面,譬如mapint, 类型名,用于实现灵活的函数调用。 【示例】 例1: typedef void (*PF)(int x); void func1(int x){ coutfunc1:xendl;} void func2(int x){ coutfunc2:xendl;} void main() {   PF?pFunc;    //声明一个函数指针只需要用PF类型名   pFunc = func1;  //此处也可以使用pFunc = func1;   pFunc(38);   pFunc = func2;   pFunc(99); } ----------------------------------------------------------------------------------------------- 例2: class CUtil { public:   CUtil();   typedef void (CUtil::*pUFunc)(int);  //定义原型为void CUtil::func(int)的函数指针的别名为pUFunc   mapint,?pUFunc funcMap;     //可以用做map容器的元素类型   void laner(int x);   void execute(); }; CUtil::CUtil() {   funcMap[0] = CUtil::laner;  //这里初始化map容器,关联数字0和函数laner } void CUtil::laner(int x) {   coutlaner:xendl; } void CUtil::execute() {   (this-*funcMap[0])(38);   //调用map[0]关联的函数   //注意1:这里必须使用this-,否则会有error C2171: “*”: “void (__thiscall CUtil::* )(int)”类型的操作  数非法的错误   //注意2:这里必须使用*解引用,才能实现函数调用,否则会有error C2064: 项不会计算为接受 1 个参数的函数的错误 } void main() {   CUtil pUtil = new CUtil();   pUtil-execute();   (pUtil-*(pUtil-funcMap[0]))(38);  //与上一句等效,注意括号要用正确 } 二、C++ static关键字 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:? //Example 1 #include iostream.h void fn(); static int n; //定义静态全局变量 void main() { ?  n=20; ?  coutnendl; ?  fn(); } void fn() {   ?n++; ?  coutnendl; } 静态全局变量有以下特点:? ??该变量在全局数据区分配内存;? ??未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);? ??静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;  静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图: ? 全局数据区 堆区 栈区 一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将 “static int n; //定义静态全局变量”改为“int n; //定义全局变量”。程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:? ??静态全局变量不能被其它文件所用;?

文档评论(0)

1亿VIP精品文档

相关文档