既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
用不同类型的参数使用模板,编译器推演得到对应函数叫做函数模板的实例化。
实例化分为:隐式实例化和显示实例化
- 隐式实例化:让编译器根据实参推演模板参数的实际类型。T的类型是编译器推到的。
#include<iostream>
using namespace std;
template<class T>
T Add(const T& x, const T& y){
return x + y;
}
int main(){
int a = 2, b = 9;
//没有明确给出参数类型
Add(a, b);
double x = 1.1, y = 2.2;
Add(x, y);
return 0;
}
- 显示实例化:在函数名后的<>中指定模板参数的实际类型。T就是<>里的类型。
#include<iostream>
using namespace std;
template<class T>
T Add(const T& x, const T& y){
return x + y;
}
int main(){
int a = 2, b = 9;
//参数显示给出
Add<int>(a, b);
double x = 1.1, y = 2.2;
Add<double>(x, y);
return 0;
}
#include<iostream>
using namespace std;
//通用加法函数
template<class T1,class T2>
T1 Add(const T1& x, const T2& y){
return x + y;
}
int main(){
Add<int,double>(a, x);
return 0;
}
注意在隐式实例化的情况下,如果有多个实参但是类型不同,但是模板中只有一个参数T,此时编译会报错。因为编译器无法确定T为什么类型。
#include<iostream>
using namespace std;
template<class T>
T Add(const T& x, const T& y){
return x + y;
}
int main(){
int a = 2;
double x = 1.1;
//a和x参数不同,模板中只有一个参数T
//编译报错
Add(a, x);
//解决:1.强转类型转化,2.显示实例化
Add(a,(int)x);
Add<int>(a,x);
return 0;
}
2.5 函数模板的匹配规则
- 一个非模板函数可以和一个同函数名的模板同时存在,并且该函数模板还可以实例化为这个非模板函数。
#include<iostream>
using namespace std;
//专门处理int类型加法函数
int Add(const int& x, const int& y){
return x + y;
}
//通用加法函数
template<class T>
T Add(const T& x, const T& y){
return x + y;
}
int main(){
Add(1, 2);//调用非模板函数
//<int>调用函数不这样写,这样写就是调用模板
Add<int>(1, 2);//调用编译器通过模板推演出来的函数
return 0;
}
- 对于非模板函数和同名函数模板,如果其它条件相同,在调用时会优先调用非模板函数,而不会从该模板产生出一个实例。如果模板可以产生一个更好匹配的函数,那么将选择该模板。
#include<iostream>
using namespace std;
//专门处理int类型加法函数
int Add(const int& x, const int& y){
return x + y;
}
//通用加法函数
template<class T1,class T2>
T1 Add(const T1& x, const T2& y){
return x + y;
}
int main(){
//与非模板函数完全匹配,不需要编译器通过模板推演出函数
Add(1, 2);
int a = 2;
double x = 1.1;
//非模板函数不适用,调用模板函数
Add(a, x);
return 0;
}
- 模板函数不允许自动类型转化,当普通函数可以自动类型转化。
三.类模板
3.1 类模板格式
定义一个学生类:
template<class T1,class T2,class T3>
class Student{
public:
//构造函数
Student(T1 name,T2 age,T3 score){
_name=name;
_age=age;
_score=score;
}
private:
T1 _name;
T2 _age;
T3 _score;
}
3.2 类模板的实例化
类的实例化与函数实例化不同,类实例化必须显示实例化。即类实例化时必须在类名后面跟<>,然后将类型放在<>里。
类模板并不是真正的类,实例化出来的才是真正的类。
//student是类名,student<string,int,float>才是类型
Student<string,int,float>s("Tom",18,85.5);
student是类名,student<string,int,float>才是类型
3.3 类的函数模板
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
中…(img-GesJqwJi-1715736631615)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新