您的位置:首页 > 其它

模板

2016-02-23 18:39 423 查看
函数模板:

template<typename T>

类型 函数名(形参列表)

{

}

类模板:

template<class T>

类型 函数名(形参列表)

{

}

//template关键字告诉c++编译器,现在开始泛型编程

//typename 告诉c++编译器,T为类型(T为类型,可以参数化,int float),你不要乱报错

//类型参数化。。。。。。。

template<typename T>

void swap2(T &a, T &b)

{

T c;

c = a;

a = b;

b = c;

}

 

void  main()

{

//泛型编程的调用方式有两种

//1自动类型推导

int x =1, y =2;

swap2(x, y);

printf("x:%d y:%d \n", x, y);

 

float x1= 1.0, y1 = 2.0;

 

//2具体类型调用

swap2<float>(x1, y1);

printf("x1:%f y1:%f \n", x1, y1);

system("pause");

}

模板函数可以像普通函数一样被重载!!!

重载函数模板匹配约定:

1先找匹配的函数

2如果没找到找匹配的模板函数

3如果没找到找可以类型转换进行参数匹配的重载函数

函数模板的本质

一,编译器并不能将函数模板编译成能处理任何类型的函数

二,编译器会根据真正使用函数模板的地方将函数模板编译成多个不同的函数

编译器会对函数模板进行两次编译:

1 在函数模板声明处进行语法扫描

2 在调用的地方对参数替换后的代码进行编译

类模板

template<typename T>

class Tclass

{

Private:

   T name;//类属性至少要在类说明中出现一次

}

#include <iostream>

using namespace std;

//定义一个类模板

template<typename T>

class AA

{

public:

AA(T a)

{

this->a = a;

}

void setA(T a)

{

this->a = a;

}

T getA()

{

return this->a

}

protected:

private:

T a;

};

class BB : public AA<int>

{

public:

//BB(int a, int b) : AA(a) 

BB(int a, int b) : AA<int>(a) //实例化B就要用B的类型先实例化A

{

this->b = b;

}

 

private:

int b;

};

void main()

{

//要把类模板具体成类型后,才能定义变量

AA<int> a(10);

BB b1(1, 2);

system("pause");

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: