函数模板 类模板 --- 简单的例子与理解


一 函数模板

1运行结果:
这里写图片描述

2代码:

/*
函数模板 定义:
C++中,通用函数就是函数模板。
通用函数指函数的形参、返回值、局部变量类型均可以不具体指定,而是等发生函数调用的时候,编译器通过传入的实参逆推真正的类型。

函数模板 作用:
将数据的值和类型都参数化 — 数据的两大特征:值和类型

函数模板 声明语法:
这里写图片描述

//例子

include

include

using namespace std;
template
//交换
void Swap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}

int main()
{
//bool型
bool b1 = true, b2 = false;
cout << “模板函数—bool类型交换前:” << b1 << ” ” << b2 << endl;
Swap(b1, b2);
cout << “模板函数—bool类型交换后:” << b1 << ” ” << b2 << endl;

//char string 型
char c1 = 'x', c2 = 'y';
char* c3 = "云雨", *c4 = "雨云";
string c5 = "太阳", c6 = "海水";

cout << "模板函数---char类型交换前:" << c1 << "  " << c2 << endl;
Swap(c1, c2);
cout << "模板函数---char类型交换后:" << c1 << "  " << c2 << endl;

cout << "模板函数---char*类型交换前:" << c3 << "  " << c4 << endl;
Swap(c1, c2);
cout << "模板函数---char*类型交换后:" << c3 << "  " << c4 << endl;

cout << "模板函数---string类型交换前:" << c5 << "  " << c6 << endl;
Swap(c1, c2);
cout << "模板函数---string类型交换后:" << c5 << "  " << c6 << endl;


//int 型
int t1 = 1, t2 = 2;
cout << "模板函数---int类型交换前:" << t1 << "  " << t2 << endl;
Swap(t1, t2);
cout << "模板函数---int类型交换后:" << t1 << "  " << t2 << endl;

//float 型
float f1 = 1.0f, f2 = 0.2f;//不加后缀f默认表示double类型
cout << "模板函数---float类型交换前:" << f1 << "  " << f2 << endl;
Swap(f1, f2);
cout << "模板函数---float类型交换后:" << f1 << "  " << f2 << endl;

system("pause");
return 0;

}

3理解:
函数模板 定义:
C++中,通用函数就是函数模板。
通用函数指函数的形参、返回值、局部变量类型均可以不具体指定,而是等发生函数调用的时候,编译器通过传入的实参逆推真正的类型。

函数模板 作用:
将数据的值和类型都参数化 — 数据的两大特征:值和类型

函数模板 格式:
这里写图片描述


二 类模板

1运行结果:
这里写图片描述

2代码:

//类模板
//写一个可以获取坐标(包括:平面直角系坐标,经纬度等等)的类模板

#include <iostream>
#include <string>
using namespace std;
template <typename T1,typename T2>
class P
{
public:
    P(T1 x, T2 y) :m_x(x), m_y(y){ }//构造函数//这种写法效率高
    T1 getX();//获取x坐标
    T2 getY();//获取x坐标
private:
    T1 m_x;//x坐标
    T2 m_y;//y坐标
};
//这种常规写法是错误的

//T1 P::getX()
//{
//}


template<typename T1,typename T2>
T1 P<T1,T2>::getX()//T1 P::::getX()//这种写法也是错误的!!!
{
    return m_x;
}

template<typename T1, typename T2>
T2 P<T1, T2>::getY()
{
    return m_y;
}


int main()
{
    //类模板实例化 --- 需要显示地声明数据类型
    P <int, int> p1(10, 20);
    cout << "平面直角坐标系中的一个坐标为:(" << p1.getX() << "," << p1.getY() << ")" << endl;
    P <string, string> p2("北纬39度54分20秒","东经116度23分29秒");
    cout << "北京的位置:(" << p2.getX() << "," << p2.getY() << ")" << endl;

    system("pause");
    return 0;
}

3理解:
与函数模板不同的是,类模板实例化的时候需要显示地声明数据类型!
原因:编译器不能根据传入的实参逆推数据类型。
声明类模板之后,类里的成员和成员函数的数据类型就都可以用类型参数代替了。

这里写图片描述
或者:

template<typename 类型参数1 , typename 类型参数2 , …> 
class 类名{
    //to do something;
};

三 总结

1适用情况:
不同的类型的函数 使用 同一种算法
C++ 允许对函数模板进行重载 以应对 有些特定的类型需要单独处理 的情况
2记忆索引:
(1)何为函数模板?何为类模板?语法格式各是什么?
函数返回值、形参 类型参数化 与函数模板不同的是类模板实例化需要显示地指明数据类型

这里写图片描述]![这里写图片描述(https://img-blog.csdn.net/20180127211024923?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU0NzkzOTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

或者:
template<typename 类型参数1 , typename 类型参数2 , …> 
class 类名{
    //to do something;
};//------常用2)自行写出简单的 函数模板 类模板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值