天天看点

模板函数

模板函数

1 解决,不同类型数据的相同操作写大量冗余的代码

2 函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能(百度百科)

3示例

// demo1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

template<typename T>
void Swap(T &a,T &b)
{
   T x = a;
   a = b;
   b = x;
   return;
}
template<typename T>//每个函数都要重新写一次在函数头
T Sum(T *X,T *Y)
{
    printf("SUM !");
    *X = *X + 2.0;
    return (*Y + *X);

}

template<class A,class B>
void printstr(A a,B b)
{
    std::cout<<a<<"-----"<<b<<std::endl;
}

int sum2(int a ,int b)
{
    printf(" sum2!");
    return (a*2 + b);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int x =1,y=2;
    Swap(x,y);

    float x1=0.0,x2 =1.1;
    Swap(x1,x2);

    printf("%d, %d, %f ,%f",x,y,x1,x2);
//-----------------------------------------------------
    getchar();

    float a =3.222;
    float b = 2.123;
    printf("%f, %f, %d",a,Sum(&a,&b),sum2(3,5));//从右到左先逐个计算各个表达式,然后从左到右逐个输出。
    getchar();
//-----------------------------------------------------
    char* str = "cccccccccc";
    int m = 0;
    printstr(str,m);
    getchar();

    return 0;
}      
模板函数

4 类模板

什么是默认构造函数:

A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter). A type with a public default constructor is DefaultConstructible.      
模板函数
//在.H中声明,注意你要用这个函数,就一定要定义所有会用到的东西,不能光声明
//仅声明不定义,会出现函数无法解析

#include <iostream>
template<typename T>
class TestC{
public:

    TestC();//这个是默认构造,不写,编译器给你生成;不过一旦显示的写出来了,就要你自己定义
    ~TestC();
    void setT(T t1);
    void PrintT();
private:
    T t;
};      
//.cpp
#include "stdafx.h"
#include <iostream>
#include "Testc.h"

template<typename T>
TestC<T>::TestC(){};
template<typename T>
TestC<T>::~TestC(){};

template<typename T>
void TestC<T>::setT(T t1)
{
    this->t = t1;
}

template<typename T>
void TestC<T>::PrintT()
{
    std::cout<<this->t <<std::endl;;
}


int _tmain(int argc, _TCHAR* argv[])
{
    
    TestC<char*> A;
    A.setT("test t");
    A.PrintT();
    getchar();

    return 0;
}
//构造函数如果不写,编译器生成默认无参构造。显示的写了构造,就必须实现它;