1、泛型是什么? 泛型编程是什么?
实质上就是不使用具体数据类型(int、double、float等),而是使用一种通用类型来进行程序设计的方法,泛泛的描述一下数据,这个方法可以大规模的减少程序代码的编写量。
模板函数如下:
其中,T是一个占位符(数据类型占位符),也就是说,将来T这个位置是一个真实的、具体的数据类型。
所以,可以把T这种类型占位符也称为一种数据类型,就叫泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。
总之,泛型也是一种数据类型,但它是用来代替所有类型的“通用类型”。
C++中,
template<typename T>
int func(const T &a1, const T &a2)
{
...
}
template <class T>
inline int func(const T &a1, const T&a2)
{
...
}
tempalte<typename T1, typename T2, typename T3>
T1 func(const T2 &t2, const T3 &t3)
{
...
}
//调用方法
func<long>(i, log);
2、常用的泛型例子有什么?
STL容器、迭代器、算法都是泛型编程的例子。
3、泛型有什么形式实现的?
通常两种形式:函数模板和类模板。
函数模板:针对仅参数类型不同的函数;
类模板:针对仅数据成员和成员函数类型不同的类;
4、什么是模板?
使用了泛型的代码称为模板,由模板生成实际代码的过程称为模板的具体实现。
5、为什么有模板?
目的就是编写一些与类型无关的代码。
6、函数重载:函数名相同,参数类型不同,参数个数不同,参数顺序不同。
比模板代码要多。
/*泛型编程之重载函数、函数模板、类模板*/
//重载函数:出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数。
#include
#include
using namespace std;
int add(int a, int b)
{
return a + b;
}
float add(float a, float b)
{
return a + b;
}
void main()
{
int a = 1, b = 2;
float c = 1.1, d = 2.5;
printf("a+b=%d\nc+d=%lf", add(a, b), add(c, d));
system("pause");
}
//泛型编程以独立于任何特定类型的方式编写代码。
//函数模板(function template)
#include
using namespace std;
template <typename T>//定义模板函数以template开始
T add(T a, T b)
{
return a + b;
}
int main()
{
int a = 1, b = 2;
float c = 1, d = 1.2;
int e = add(a, b);
float f = add(c, d);
printf("a+b=%d\nc+d=%lf", e, f);
system("pause");
return 0;
}
//类模板
#include
using namespace std;
template <class T>
class operate {
public:
T a, b;
T add()
{
return a + b;
}
};
int main()
{
//inital
int a = 1, b = 2;
float c = 1.0, d = 2.2;
operate<int> add_int_num;
operate<float> add_float_num;
add_int_num.a = a;
add_int_num.b = b;
add_float_num.a = c;
add_float_num.b = d;
//get results
printf("(int)a+b=%d\n(float)a+b=%lf\n", add_int_num.add(), add_float_num.add());
return 0;
system("pause");
}