本文基于《C++ Primer(第5版)》和网上博客,整理而成。
一、类型别名
类型别名是一个名字,它是某种类型的同义词,有两种方法可用于定义类型别名:typedef、using。
1、关键字typedef
typedef 它在自己的作用域内给一个已经存在的类型一个别名,编译阶段,会进行类型检查。
1 typedef double wages; //wages是double的同义词 2 wages hourly; //等价于double hourly;
注意:使用typedef时,最后要加分号,另外,含有typedef的声明语句定义的不再是变量而是类型别名。
(1)指针、常量和类型别名
若某个类型别名指代的是复合类型或常量时,要特别注意。
1 typedef char * pstring; 2 pstring a,b; //a,b都是指向char的指针 3 const pstring cstr=0; //cstr是指向char的常量指针
针对pstring,其基本数据类型是指针,对第三行代码它实际上相当于char* const。故不能直接将类型别名替换成它本来的样子,来理解该语句的含义。
注:当const和typedef一起出现时,typedef不是仅仅简单的字符串替换。
(2)返回数组指针
1 typedef int arrT[10]; //arrT是一个类型别名,它表示的类型是 2 //含有10个整数的数组 3 arrT *func(int i); //func返回一个指向还有10个整数的数组指针
二、#define
1、define是预处理指令的一种,它用来定义宏,宏只是一个简单的替换,将宏变量所对应的值替换。不做正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
1 #define N 5 2 int main() 3 { 4 cout<<N; //输出5 5 return 0; 6 }
2、define的容易出现的问题
(1)如:想计算a=10*10,结果输出35
1 #define N 5+5 2 int main() 3 { 4 int a=N*N; 5 cout<<a; //输出35 6 return 0; 7 }
这是因为define只是简单的替换,所以,a=5+5*5+5。若想计算10*10,可将第一行改为
1 #define N (5+5)
另外,两者的作用域不同
1、#define 无论在哪定义过,在其它的地都可以使用
2、typedef 只能在定义的作用域内使用
本文只是简单的说一说,不详细的地方,请见参考。
Ref:
http://www.cnblogs.com/li-peng/p/3853818.html
http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html