黑马程序员2017C++STL教程(1到4)

一. 函数模板基本语法
#include <iostream>

using namespace std;
template<class T>
void MySwap(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}


//注意对于一个template而言,只能将其用于,紧贴它的那一个函数,二对于后面的,都是无效的。必须紧贴再定义其他的
template<class T1>
void MySwap1(T1& a, T1& b)
{
    T1 temp = a;
    a = b;
    b = temp;
}

void test01()
{
    int a = 10;
    int b = 20;
    //1 自动类型推导
    cout<<"a: "<<a<<" b: "<<b<<endl;
    MySwap(a,b);//编译器根据你传的值,进行类型自动推导
    cout<<"a: "<<a<<" b: "<<b<<endl;

    double da = 1.23;
    double db = 3.21;
    cout<<"da: "<<da<<" db: "<<db<<endl;
    MySwap(da,db);//编译器根据你传的值,进行类型自动推导
    cout<<"da: "<<da<<" db: "<<db<<endl;

    int c = 40;
    int d = 80;
    cout<<"c:"<<c<<"  d:"<<d<<endl;
    //2. 显式的指定类型
    MySwap<int>(c,d);
    cout<<"c:"<<c<<"  d:"<<d<<endl;
}

int main()
{
    test01();
    return 0;
}

二. 函数模板和普通函数的区别,函数模板调用规则
#include <iostream>
//函数模板可以像普通函数那样,可以被重载
//C++编译器优先考虑普通函数
//如果函数模板可以产生一个更好的匹配,那么选择模板
//可以通过空模板实参列表的语法,限定编译器只能通过模板匹配。
using namespace std;

template<class T>
T MyAdd(T a, T b){
    cout<<"template MyAdd runs"<<endl;
    return a+b;
}

int MyAdd(int a, char c){
    cout<<"general MyAdd runs"<<endl;
    return a+c;
}

template<class T>//函数模板可以像普通函数那样,可以被重载
void Print(T a){
    cout<<"Print(T a)..."<<endl;
}

template<class T>
void Print(T a, T b){
    cout<<"Print(T a, T b)..."<<endl;
}

template<class T>
T MyMinus(T a, T b){
    cout<<"template MyMinus(T a, T b) runs"<<endl;
    return a-b;
}

int MyMinus(int a, int c){
    cout<<"general MyMinus runs"<<endl;
    return a-c;
}

template<class T>
T MyMultiply(T a, T b){
    cout<<"template MyMultiply(T a, T b) runs"<<endl;
    return a-b;
}

int MyMultiply(int a, float c){
    cout<<"general MyMultiply runs"<<endl;
    return a*c;
}

void test1(){
    int a = 10;
    int b = 20;
    char c1 = 'a';
    char c2 = 'b';

    MyAdd(a,c1); //结果是general MyAdd runs, 因为和普通函数能够直接完全对应
    MyAdd(a,b);//结果是template MyAdd runs
    MyAdd(c1,b);//结果是general MyAdd runs,because普通函数能够自动进行类型转化,而函数模板必须严格类型匹配
}

int main()
{
    //函数模板不允许自动类型转换
    //普通函数能够自动进行类型转化
    int x = 2;
    int y = 1;
    Print(x);
    Print(x,y);
    //test1();
    cout<<"--------------------"<<endl;
    //general MyMinus runs...C++编译器优先考虑普通函数
    cout<<MyMinus(x,y)<<endl;
    cout<<"--------------------"<<endl;
    //template MyMultiply(T a, T b) runs. 如果函数模板可以产生一个更好的匹配,那么选择模板
    cout<<MyMultiply(x,y)<<endl;
    cout<<"--------------------"<<endl;
    //template MyMinus(T a, T b) runs.可以通过空模板实参列表的语法,限定编译器只能通过模板匹配。
    cout<<MyMinus<>(x,y)<<endl;

    return 0;
}

三. c编译过程概述
四. 编译过程测试(略)

猜你喜欢

转载自blog.csdn.net/garrulousabyss/article/details/80035625