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++知识。

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

相关推荐

  1. C++模板讲解

    2024-04-14 11:28:01       43 阅读
  2. [C++][特殊类设计][单例模式]详细讲解

    2024-04-14 11:28:01       32 阅读
  3. c++类全面讲解

    2024-04-14 11:28:01       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 11:28:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 11:28:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 11:28:01       87 阅读
  4. Python语言-面向对象

    2024-04-14 11:28:01       96 阅读

热门阅读

  1. Gitea:开源的轻量级Git服务平台

    2024-04-14 11:28:01       45 阅读
  2. 细说php语法糖

    2024-04-14 11:28:01       40 阅读
  3. 蓝桥杯python组基础知识速学!!!!

    2024-04-14 11:28:01       114 阅读
  4. MySQL基础教程(第二部分)

    2024-04-14 11:28:01       47 阅读
  5. Mysql入门基础教程(第一部分)

    2024-04-14 11:28:01       36 阅读