36.c/c++程序员面试宝典-泛型编程

36.c/c++程序员面试宝典-泛型编程


泛型编程是一种比较新的编程模式,也是c++中使用相对较少的一个领域。所谓的泛型编程,就是以独立于任何特定类型实现的方式编写代码。在使用泛型编程时,需要用户提供具体程序实例所操作的类型或值。


面试题136  什么是泛型编程****


分析:所谓的泛型编程,就是以独立于任何特定类型实现的方式编写代码。在使用泛型编程时,需要用户提供具体程序实例所操作的类型或值。

泛型编程和面向对象编程一样,都是多态性的某种实现。面向对象编程中的多态性主要是在运行时使用存在继承关系的类,在使用这些类时能够忽略基类与派生类之间的类型差异。而只是使用基类的引用或指针来使用派生类的实现。通过这种方式使基类和派生类使用相同的代码。


而泛型编程,其多态性主要是指所编写的类和函数能在编译时确定使用何种类型。通过使用泛型编程,一个类或函数可以操作多个类型的对象,而这些对象之间并不存在任何的关系。c++中的标准库STL的容器、迭代器、算法就是很好的泛型编程的实现。由于标准库使用了泛型技术,使得该库几乎能使用于任何的类型。虽然设计标准库时并不清楚将会对何种类型的数据进行操作。


在c++中,实现泛型编程主要是利用c++中的模板进行实现。通过设计类模板或者函数模板,为程序提供独立于特定类型的实现。


【答案】所谓的泛型编程,就是以独立于任何类型实现的方式编写代码,针对不同的类型提供通用的实现。



面试题137  c++如何实现泛型编程****


分析:在c++中实现泛型编程,其基础是模板技术。在c++中模板技术的实现包括函数模板和类模板。通过实现函数模板和类模板,可以为不同的类型提供通用的代码。

如下代码所示,实现利用一个函数模板,实现两个参数的相加并返回其结果:

#include<iostream> //包含标准输入输出头文件

#include<string>  //包含c++中的字符串处理头文件

using namespace std;  

template<class T>  //声明模板的标识

T Add(T a,T b)  //函数原型

{

T result;  //使用参数化的类型定义变量

result=a+b;  //并使用参数的“+”运算符进行运算

return result;  /返回运算结果

}

int main()

{

cout<<"2+3="<<Add(2,3)<<endl;  //输出整型类型的“+”运算结果

cout<<"sdf+123"<<Add(string("sdf"),string("123")))<<endl;  //输出string类型的“+”运算结果

return 0;

}


在不使用泛型编程时,要实现对不同的数据类型进行“+”运算,那么最好的手段就是对函数进行重载,如以下代码所示:

#include<iostream>  //包含标准输入输出头文件

#include<string>  //包含c++中的字符串处理头文件

using namespace std;

int Add(int a, int b)  //针对整型的“+”运算

{return a+b;}

float Add(float a,float b)  //针对浮点型的加法

{return a+b;}

int main()

{

cout<<"2+3"<<Add(2,3)<<endl;  //输出整型类型的“+”运算结果

float a=1.2,b=1.3;

cout<<"1.2+1.3="<<Add(a,b)<<endl;  //输出float类型的“+”运算结果

return 0;

}


上面代码显然后一种是采用重载技术的代码,而没有采用泛型编程技术的代码来的简洁。而且在需要新增对string类型的“+”运算时,使用重载技术的版本需要新增一个重载的函数,而泛型则不用。对于泛型来说,只要相应的类型能提供对“+”的重载操作,那么就不用对不同的类型再写一份相同的代码。


泛型编程,提供了独立于特定类型的操作算法。在使用泛型编程时,就需要明确知道该泛型究竟是针对何种类型进行操作,从而在泛型编程中调用相应类型的操作。这个类型是需要调用方在调用时进行传递的。然后在编译时,由编译器根据泛型的调用所传递的类型及模板生成该类型专用的代码。编译器针对同一种类型只生成一次,以后的调用都使用该代码。如果没有调用泛型时,编译器将不会为泛型编程生成任何的代码。


注意:由于泛型编程时使用了模板技术,而使用模板技术时编译器会为不同的参数类型生成不同的目标代码。因此如果在程序中大量使用泛型,而且各种参数类型不一样时会显著增大程序的大小。


【答案】c++中泛型编程的实现是使用c++中的模板技术来实现的,主要是设计函数模板和类模板。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值