C++模板的解析

本文详细介绍了C++模板的各个方面,包括模板的本质、定义、函数模板的显式和隐式调用、函数模板与普通函数的区别、函数模板的重载、特化、多文件实现、非类型参数,以及类模板的声明与实例化。此外,还讨论了类模板的继承、成员函数的类外实现以及友元函数的处理。通过学习,读者将能够更好地掌握C++模板的使用技巧。
摘要由CSDN通过智能技术生成

一,

1,本质:是使用一个万能的虚拟类型,用一个标志来表示类型,不是实际的类型。独立于任何特定类型的编程,c++的一个部分,方便开发提高代码的复用性。

2,定义:

单类定义:template < class 类型名称 >        

多类定义:template < class 类型名称 1,class 类型名称 2> 

例       如: template < class T1,typename 2>  

注       释: template  ----- 声明创建模板
                   typename --(也可以用class代替)表明后的类型是一个通用类型,或许叫做虚拟类型
                  T1------通用类型或者虚拟类型(理解成类型)可以在函数中直接当做普通类型使用。

                  多个虚拟类型则使用逗号隔开。

二,函数模板的定义及调用

#include <iostream>
using namespace std;

template <class T1,class T2>
T2 arr(T1 x,T2 y)
{
    return x + y;
}

调用方法:

                第一种:  函数名 <实际类型1,实际类型2>(参数列表);
                    显式类型推导   fun<int>(1,2);
                第二种: 函数名(参数);
                    隐形类型推导    fun(1,2)
                 注意:显示类型推导 参数和推导的类型必须一致。如果有普通函数和模板函数,在调用时可以用显示调用,省略类型的方式  swap<>(1,2)。

 三,普通函数和函数模板的区别

#include<iostream>
using namespace std;

int myAdd(int a, int b)
 {
    return a + b;
 }
template<class T>
T myAdd2(T a, T b) 
{
    return a + b;
}
void test() 
{
    int a = 10;
    int b = 20;
    char c = 'c';
    //这里进行了隐式的转换,将char转换成了int
    cout << myAdd(a, c) << endl;
    //这里使用c作为实参就会报错
    //cout << myAdd2(a, c) << endl;
    //这种情况下就不会报错,会进行隐式转换
    cout << myAdd2<int>(a, c) << endl;
}

int main()
 {
    test();
    system("pause");
    return 0;
}


    1,函数只可以有一种数据类型相匹配。模板有多种类型
    2,隐式推导优先使用普通函数,只有普通函数不匹配才使用函数模板
    3,函数模板只有在调用时,才会构建函数,而普通函数是在编译时。
    4,普通函数调用时候可以发生自动类型转换,而函数模板不行。  

    5,如果函数模板和普通函数都可以实现,优先调用普通函数

    6,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值