C++模板讲解

模板又称为泛型编程(可以将类型(基本类型、自定义类型)当做参数, 进行传递)

 

1.函数模板

特点:只适用于函数体相同 参数个数相同 类型不同的情况。

使用 

建立一个通用函数 , 其函数返回值类型和形参类型不具体制定 而是一个虚拟类型 .
int div(int a,int b)
{
        return a/b;
}
void div(char a,char b)
{
}
int main()
{
        div(3,2);   
}

示例1:函数模板

建立一个通用函数, 其函数返回值类型和形参类型不具体制定 而是一个虚拟类型.

#include <iostream>
using namespace std;
//模板函数
template<typename T>   //<>放的是 类型参数 int string char.....
void show(T s,T a)
{
    cout<<"T .... "<<s<<endl;
}
int main() {
    show<string>("hello","world");//<>放的是类型参数
    show<int>(10,20);//<>放的是类型参数
    return 0;
}

示例2:类型当做返回值类型 

#include <iostream>
using namespace std;
//模板函数
template<typename T> //<>放的是 类型参数 int string char.....
T show(T s,T a)
{
    cout<<"T .... "<<s<<endl;
    return s;
}
int main() {
    cout<<show<string>("hello","world")<<endl;//<>放的是类型参数
    cout<<show<int>(10,20)<<endl;//<>放的是类型参数
    return 0;
}

 示例3:多类型参数  

注意:使用多类型的时候,每个类型必须使用
#include <iostream>
using namespace std;
template<typename T,typename U>
T div(T a, T b, U c)
{
    cout<<c<<endl;
    return a/b;
}
int main()
{
    cout<<div<double, string>(10, 3, "hello farsight")<<endl;
}

#include <iostream>
using namespace std;
class Person
{
    int age;
public:
    Person(int age):age(age){}
    void show(){cout<<age<<endl;}
};
//函数模板:函数名相同,参数类型不同,个数相同
template<class T,typename U>//Person
void div(T a,T b,U num)//()参数列表 形参
{
    a.show();
    b.show();
    T c(122);
    c.show();
}
int main()
{
    Person p(1);
    //模板类型:自定义类型
    div<Person,int>(Person(12),p,10);
    return 0;
}

2.函数模板和普通函数的区别  

1) 普通函数可以自动类型转换 函数模板必须显示指定类型
2) 同名的普通函数和模板函数出现,优先调用普通函数
3) 函数模板也可以发生重载
示例:优先调用普通函数
template<typename T>
void show(T b)
{
    cout<<b<<endl;
}
void show(int a)
{
    cout<<"show"<<endl;
}
int main()
{
    show(12);//同名的普通函数和模板函数出现,优先调用普通函数
}

3.函数模板也可以发生重载

template <typename T>
T my_sum(T a,T b){
    cout << "模板函数" << endl;
    return a+b;
}
int my_sum(int a,char b){
    cout << "普通函数"<< endl;
    return a+b;
}
cout << my_sum(a,b) << endl; //普通函数
cout << my_sum<int>(a,b) << endl; //模板函数

 

4.类模板

示例1:成员变量

#include <iostream>
using namespace std;
template <typename T1,typename T2>
class Person{
private:
    T1 age;
    T2 name;
public:
    Person(T1 a,T2 n):age(a),name(n){}
    void show(){
        cout << name << ":" << age << endl;
    }
};
int main()
{
    Person<int,string> p(10,"王美丽");
    p.show();
    return 0;
}
## 使用方法:
        显示指定类型 Person<int,string> p(10," 王美丽 ");
## 泛型编程:
        类型参数化

示例2:在栈和堆上创建

#include <iostream>
using namespace std;
template<typename T>
class Person
{
public:
    Person(int age):age(age)
    {
    }
    void eat(T food)
    {
        cout<<food<<age<<endl;
    }
private:
    int age;
};
int main()
{
    Person<string> xiaoming(2);
    xiaoming.eat("牛排");
    Person<string>* p = new Person<string>(10);
    p->eat("鸡排");
    delete p;
}
注意:类模板不建议分文件编写,所有的函数实现都写在头文件( .h )中

结语

以上结束C++模板使用方法,本次代码分享到此结束,后续还会分享C++知识。

最后的最后,还请大家点点赞,点点关注,谢谢大家!

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值