首页 » C++ » 函数模板 类模板 --- 简单的例子与理解

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

原文 http://blog.csdn.net/qq_35479392/article/details/79183287

2018-01-28 02:00:37阅读(252)

函数模板

1运行结果:
函数模板  类模板  --- 简单的<a href=例子与理解" src="http://img.blog.csdn.net/20180127210825521?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU0NzkzOTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title="">

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)何为函数模板?何为类模板?语法格式各是什么?
函数返回值、形参 类型参数化 与函数模板不同的是类模板实例化需要显示地指明数据类型

函数模板  类模板  --- 简单的例子与理解(http://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)自行写出简单的 函数模板 类模板

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹