c++作为一种从c演变过来的并且采用了面向对象理念的半面向过程半面向对象的编程语言,在c的显式转换和隐式转换的基础上,也有自己的类型转化方式。在具体讨论c++的类型转换之前,首先来了解一下其中用到的重要的技术思想-泛型。
还是首先来举一个老生常谈的例子,写一个比较两个数据对象大小的函数,如果不出意外的话,可能至少有以下几个:
1 int cmp(int a,int b);
2 double cmp(double a,double b);
3 double int cmp(int a,double b);
4 int cmp(char a,char b);
5 int cmp(const A & a,const B & b); (A,B is a class)
我们知道在c++或java(c不支持函数重载)里面有重载机制,允许函数名称相同,参数个数和参数类型不同。
c是如何解决"函数重载"问题的呢?宏机制。比如以上问题,我们可以编写以下宏:
6 #define Min(x,y) ((x)<(y)?(x):(y))
但是宏机制有什么问题呢?
宏的第一个问题就是不检查类型,无法在编译期间检查程序错误,比如一个自定义对象和一个整数进行Min操作;
第二个问题就是宏只是进行单纯的文本替换,因为优先级问题,宏很容易出现错误结果。
但是即使是函数重载,它的缺点是显而易见的:
代码冗余。这四个函数的逻辑是一致的,但是却又四个版本。
另外一个问题,相似类的定义问题。
c++内建的几种数据类型(int double),如果我们想建立一个数组的话,使用标准模式: class A [max] 或者 class A* =new A[max]; 如果是自定义的类,并且这样的类千变万化,我们就需要一种机制来解决相似类的重复定义问题,降低编程工作量。
还有一个问题,型式兼容性问题。
一 . 从型式转换角度看
c里面的类型转化:(T)x
1.内建型式(int double)对象转换安全性基本保证
2.类对象之间的转换可能导致无法控制的结果
c++型式的转换:T(x)
1.可能需要单参数构造函数和重载的型式转换操作符
2.如果未实现 转换就不存在
二 . 从类库架构上看
根据类的继承层次,需要频繁的进行对象的型式转换,比如基类的指针或者引用指向子类,或者子类转换为父类
但是已有的c/c++型式转换均为静态转换,不能适应指针或者引用的多态性
所以 我们就需要一种机制来保证型式兼容,这种机制必须具有以下特点:
1.确保型式转换合法有效,并且在失败时通知用户
2.需要维持对象的运行时型式信息(run-time type information,RTTI)
以上,就是泛型存在的价值:函数重载问题 相似类定义问题 型式兼容性问题。
泛型的具体实现方式--模板和型式参数化在下篇文章介绍。