在C++中,有一个关键字typedef,它主要是把一种数据类型定义为某一个标识符。在程序员之后的程序开发中可以直接应用这一标识符来实现相应数据类型变量的定义。
根据我的理解,它就是把一大长串的名字定义简化成程序员自己定义的一小撮名字,来提高编程的速度,同时从某个角度来说,实现了代码的隐藏。
以下,将对typedef的使用做一个简单的说明和整理:
C++ typedef,直观理解为“类型定义”。也就是说,它定义的对象是:类型! 类型是什么?类型是用来定义变量的东西,而typedef实现了对类型的定义。
举例一【定义基本类型&标准库类类型】:
<span style="font-size:18px;"><span style="font-size:18px;"> typedef unsigned int uint;
typedef string s;
int main ()
{
unsigned int a; // a的类型是:无符号整型
uint b; // b的类型是:无符号整型,a和b是相同类型的
string c; //c的类型是:字符串类型
s d; //d的类型是:字符串类型,c和d是相同类型的
a=1024; //允许这样的赋值
b=1024; //允许这样的赋值,a与b的值相同
c="hello"; //允许这样的赋值
d="hello"; //允许这样的赋值,c与d的值相同
return 0;
}
</span></span>
从以上这个例子上,我们可以将typedef作用理解为定义类型的别名,也就是说,对于同一个类型,它可以叫这个名字,也可以叫typedef为它更改的另一个名字。
举例二【定义结构类型】
<span style="font-size:18px;">typedef struct Node
{
int data;
struct Node *next;
} NewNode; //将Node结构类型定义为NewNode这个名字,在之后的程序中使用
int main()
{
NewNode newnode;
newnode.data=0;
newnode.next=NULL;
return 0;
}
</span>
从上面的例子中,可以看出,这里的typedef将Node结构体重新命名定义成为NewNode这个类型名字,在之后的程序中,可直接使用NewNode这个名字,来代替原结构体。简化了编程。
举例三【定义类类型】
<span style="font-size:18px;">typedef class Node
{
public:
int data;
class Node *next;
} NewNode; //将Node结构类型定义为NewNode这个名字,在之后的程序中使用
int main()
{
NewNode newnode;
newnode.data=0;
newnode.next=NULL;
return 0;
}</span>
这个和结构类型很相似,主要是为了说明typedef也可以定义类类型。注意,因为后面需要引用对象newnode的成员变量,故其成员变量必须显示设置为public的属性,而结构中的成员变量默认就是public的。关于这一点,可以参见日志:C++中struct和class使用的区别 http://blog.youkuaiyun.com/u013700658/article/details/27224945
举例四【定义数组类型】
typedef int LisaArray1000Int [1000];
上述代码使用了typedef重新定义了一个长度为1000的整型数组。
接下来,程序员就可以直接使用LisaArray1000Int这个名字来定义数组了,如下:
LisaArray1000Int la1000i;
这里的la1000i就是一个长度为1000的整型数组名,以上的代码相当于:
int la1000i[1000];
这就是使用typedef定义数组的方法。
举例五:【定义函数指针】
通常,书写一个函数指针和函数名称是很冗长而且易于混乱程序员的目光,它们必然会降低编程的速度。所以,使用typedef可以简化编程。
如下:
typedef void(* LisaFun) (string);
这里的LisaFun是这样一个函数指针,它指向一个返回值类型为void,参数为string类型的函数。
在接下来的编程中,可以这样使用:
void say(string s)
{
std::cout<<"Lisa say "<<s<<std::endl;
}
void sing(string s)
{
std::cout<<"Lisa sing "<<s<<std::endl;
}
int main()
{
LisaFun myFun;
myFun=say;
(*myFun)("Good Morning!");
myFun=sing;
(*myFun)("My Heart Will Go On!");
}
函数指针一般用于回调函数、中断处理过程的声明,以及在面向对象程序设计中对事件处理过程的声明。