天天看点

C++ typedef用法

typedef的语法描述:

在现实生活中,信息的概念可能是长度,数量和面积等。在C++语言中,信息被抽象为int、float和 double等基本数据类型。从基本数据类型名称上,不能够看出其所代表的物理属性,并且int、float和double为系统关键字,不可以修改。为了解决用户自定义数据类型名称的需求,C++语言中引入类型重定义语句typedef,可以为数据类型定义新的类型名称,从而丰富数据类型所包含的属性信息。

typedef的定义

typedef 类型名称类型标识符;      如 typedef  int  LENGTH;

可使用LENGTH 定义变量;       如 LENGTH   c;

typedef 的主要应用形式:

1、  为基本数据类型定义新的类型名、定义与平台无关的类型。举例如上

2、 为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。

举例:typedef struct { int x;}Point;   可用Point 来声明结构体;

3、  为数组定义简洁的类型名称。

举例:typedef int array_10 [10];  可使用 array_10 a;a为int数组,10个元素

4、 为指针定义简洁的名称//普通指针、函数指针

typedef int(*MyFun)(int a,int b); 可使用MyFun声明函数指针、MyFun p;

int Max(int a,int b);   p=Max;

5、  为复杂声明定义新的简单别名。

举例1:原始:int *(*a[5])(int ,char*); 变量名为a;

        使用typedef int *(*p)(int ,char*);     p a[5]即可

举例2:原始:void (*b[10])(void (*)()); 分两步替换即可。先替换右侧括号中的。

                   typedefvoid(*pFun1)();  

                   typedefvoid(*pFun2)(pFun1);            pFun2  b[10]即可

举例3:原始:double (*)()(*e)[9];  分两步替换即可。

typedef double(*p);

typedef p(*pFun1)[9];                                 pFun1 e;即可

理解复杂声明可用的“右左法则”;从变量名看起,先往右,再往左,碰到一个圆括号就    调整阅读的方向,括号内分析完就跳出括号,依然先右后左的顺序,如此循环到结束。

举例:int (*func[5])(int *); func 右边是一个[]运算符,表明func是具有5个元素的数          组,左边有* ,表明func的元素是指针,[]运算符优先级比*高,func先跟[]结合).

Func数组的元素是函数类型的指针,它指向的函数具有int *类型的形参。

两个模式:

typedef (*)(…) 函数指针

typedef (*)[]  数组指针

在c++类中使用函数指针:

typedef 返回类型(类名::*新类型)(参数表);使用类成员函数必须有”->*”或者“.*”

需要注意的问题:

1、  typedef不创建新类型,只是为已有类型创建一个新名称。

2、 它只适用于类型名称定义,不适应于变量定义。

3、  与#define可达到相同效果,但实质不同。#define主要定义常量,此常量可以为任何的字符及其组合,在编译之前,将此常量出现的所有位置,用其代表的字符或字符组合无条件的替换,然后进行编译。typedef是为已知数据类型增加一个新名称,其原理与使用int 、double等保留字一致。

typedef和define具体的详细区别:

1、#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。

         2、typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。

3、typedef int * int_ptr与 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说,#define在预处理时进行简单的替换,而typedef不是简单替换,而是采用如同定义变量的方法那样来声明一种类型。举例:t

ypedef int* pint;

#definePINT int*    

const  pint p;//p不可更改。但p指向的内容可更改。

const PINTp;//p可更改,但是p指向的内容不可更改。

陷阱:

1、typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。

typedef char *PSTR;   int fun(const PSTR,const PSTR);

const PSTR 不是const  char *;  而是  char * const;

2、typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如typedef static int INT2;//不可行

继续阅读