一、模板
1.1 模板的概念
模板是支持参数化多态的工具,可以让类或函数支持一种通用类型
类中的属性、成员函数的参数、函数返回值在实际使用时可以是任何数据类型
通过模板程序员就可以编写一些与类型无关的代码
模板为不同的数据类型制定了一套通用的算法
模板通常有两种形式:
- 函数模板
- 类模版
1.2 函数模板
函数模板可以使一个函数的参数和返回值支持通用类型,使此函数专注于算法设计
函数模板针对参数类型不同的函数,参数类型不一样,但是功能与函数名称相同
#include <iostream>
using namespace std;
// 模板说明
// 用T类型作为通用类型,来设置一个模板的函数或者类
template <class T> // 正式代码中看到<>大概率使用模板
T add(T a, T b) // 可以传入任何类型
{
return a + b; // 如果传入的参数类型不支持此计算则会报错
}
int main()
{
cout << add(2,3) << endl; // 5
cout << add(2.3,3.3) << endl; // 5.6
string s1 = "AA";
string s2 = "BB";
cout << add(s1,s2) << endl; // AABB
// cout << add("AA","BB") << endl; 错误,能传进去但是不支持加法
return 0;
}
自定义狗类(拓展)
#include <iostream>
using namespace std;
template <class T>
T add(T a, T b)
{
return a + b;
}
class Dog
{
public:
// 单纯让语法通过,逻辑乱写的
friend Dog operator +(const Dog& d1, const Dog& d2);
};
Dog operator + (const Dog &d1, const Dog& d2)
{
cout << "编译通过" << endl;
Dog d;
return d;
}
int main()
{
cout << add(2,3) << endl; // 5
string s1 = "AA";
string s2 = "BB";
cout << add(s1,s2) << endl; // AABB
// cout << add("AA","BB") << endl; 错误,能传进去但是不支持加法
Dog d1, d2;
add(d1, d2);
return 0;
}
1.3 类模板
类模板可以把模板的范围扩展到一个类中
#include <iostream>
using namespace std;
template <typename T> // typename等效于class
class Test
{
private:
T value;
public:
Test(T value):value(value){}
T get_value()
{
return value;
}
void set_value(T value)
{
this->value = value;
}
};
int main()
{
// 创建一个T类型为int的Test对象t
Test<int> t1(45);
cout << t1.get_value() << endl;
t1.set_value(110);
cout << t1.get_value() << endl;
Test<double> t2(4.5);
cout << t2.get_value() << endl;
Test<string> t3("hahahhaha");
cout << t3.get_value() << endl;
return 0;
}
类内声明类外定义
#include <iostream>
using namespace std;
template <typename T> // typename等效于class
class Test
{
private:
T value;
public:
// 类内声明
Test(T v);
T get_value() const;
void set_value(T v);
};
// 类外定义
template <typename T>
Test<T>::Test(T value):value(value){}
template <typename T>
T Test<T>::get_value() const
{
return value;
}
template <typename T>
void Test<T>::set_value(T v)
{
value = v;
}
int main()
{
// 创建一个T类型为int的Test对象t
Test<int> t1(45);
cout << t1.get_value() << endl;
t1.set_value(110);
cout << t1.get_value() << endl;
Test<double> t2(4.5);
cout << t2.get_value() << endl;
Test<string> t3("hahahhaha");
cout << t3.get_value() << endl;
return 0;
}