携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
1.函数模板的局限性
局限性:
- 模板的通用性并不是万能的
例如:
template<class H>
void f(H a, H b)
{
a + b;
}
在上述代码中提供的赋值操作,如果传入的a和b是一个数组,就无法实现了
再例如:
template<class H>
void f(H a, H b)
{
if(a != b) { ... }
}
在上述代码中,如果T的数据类型传入的是像类这样的自定义数据类型,也无法正常运行
因此C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板
2.普通模板实现判断两个整型变量是否相等
#include<iostream>
#include <fstream>
#include <string>
using namespace std;
void spr(int a, int b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是普通函数 " << endl;
}
template<typename H>
bool spr(H a, H b) {
if (a == b)
return true;
else
return false;
}
int main() {
char a = 'a';
char b = 'b';
if (spr(a, b)) {
cout << "a == b!" << endl;
}
else {
cout << "a != b" << endl;
}
system("pause");
return 0;
}
输出:
a != b 请按任意键继续. . .
3.在上述代码中,如果H的数据类型传入的是像类这样的自定义数据类型,也无法正常运行
class H
{
public:
H(string name, int age)
{
this->Name = name;
this->Age = age;
}
string Name;
int Age;
};
template<typename H>
bool spr(H a, H b) {
if (a == b)
return true;
else
return false;
}
int main() {
char a = 'a';
char b = 'b';
H h01 = { "道枝骏佑",19 };
H h02 = { "白敬亭",28 };
if (spr(h01, h02)) {
cout << "h01 == h02!" << endl;
}
else {
cout << "h01 != h02" << endl;
}
system("pause");
return 0;
}
4.具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
class L
{
public:
L(string name, int age)
{
this->Name = name;
this->Age = age;
}
string Name;
int Age;
};
template<typename H>
bool spr(H &a, H &b) {
if (a == b)
return true;
else
return false;
}
template<>bool spr(L &a, L &b) {
if (a.Name == b.Name && a.Age == b.Age)
return true;
else
return false;
}
int main() {
char a = 'a';
char b = 'b';
L h01 = { "道枝骏佑",19 };
L h02 = { "白敬亭",28 };
bool ret = spr(h01, h02);
if (ret) {
cout << "h01 == h02!" << endl;
}
else {
cout << "h01 != h02" << endl;
}
system("pause");
return 0;
}
输出:
h01 != h02 请按任意键继续. . .
5.函数重载
函数重载的概念
- 是C++的特色,允许一个程序中定义多个同名函数,但函数的参数列表(也称为特征标)必须不同。
- 可以通过函数重载,使函数根据不同类型的参数实现不同的功能(相同的也行)。编译器会按照调用函数的参数个数和类型,决定使用哪个同名函数。
- 参数类型和个数完全匹配的同名函数将被优先使用;如果参数类型没有完全匹配,则查找能够通过强制类型转换达成要求的同名函数。否则会报找不到函数的错误。
注意: 函数重载必须是参数列表不同,函数返回类型不能作为重载依据。编译只会根据函数名和参数列表,对函数名进行区分。
二义性
函数重载容易出现的问题就是二义性,即编译器不能根据参数区分同名函数。下面是几种常见的情况。
强制类型转换
如果实参与参数列表不完全匹配,编译器在强制类型转换时,容易出现二义性