C++ 函数模板 懒人必备!
2017-02-03 11:18
197 查看
为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示:
这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已,这看起来有点浪费代码,能不能把它们压缩成一个函数呢?
能!可以借助本节讲的函数模板。
我们知道,数据的值可以通过函数参数传递,在函数定义时数据的值是未知的,只有等到函数调用时接收了实参才能确定其值。这就是值的参数化。
在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。
值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。
一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。
下面我们就来实践一下,将上面的四个Swap() 函数压缩为一个函数模板:
在下是个linux小菜,希望边学习c语言能一边学习vim和linux这样学起来稍微慢一些,不过效果很棒棒噢!
欢迎来到我的IT 博客http://www.nightsong.cc
QQ:1623231307
//交换 int 变量的值 void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //交换 float 变量的值 void Swap(float *a, float *b){ float temp = *a; *a = *b; *b = temp; } //交换 char 变量的值 void Swap(char *a, char *b){ char temp = *a; *a = *b; *b = temp; } //交换 bool 变量的值 void Swap(bool *a, bool *b){ char temp = *a; *a = *b; *b = temp; }
这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已,这看起来有点浪费代码,能不能把它们压缩成一个函数呢?
能!可以借助本节讲的函数模板。
我们知道,数据的值可以通过函数参数传递,在函数定义时数据的值是未知的,只有等到函数调用时接收了实参才能确定其值。这就是值的参数化。
在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。
值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。
一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。
下面我们就来实践一下,将上面的四个Swap() 函数压缩为一个函数模板:
/************************************************************************* > File Name: swap.cpp > Author: Nightsong > Mail: 16232321307@qq.com > Created Time: 2017-01-20 10:10:34 ************************************************************************/ #include<iostream> #include <string> template <class T> void swap(T &a, T &b) { T tmp = a; a = b; b = tmp; } int main () { int i1 = 100; int i2 = 200; std::cout<< "i1 = "<< i1 <<"i2 = " << i2<<"\n"; swap(i1, i2); std::cout<< "i1 = "<< i1 <<"i2 = " << i2<<"\n"; std::string a="night"; std::string b="song"; std::cout<< a << b <<"\n"; swap(a, b); std::cout<< a << b <<"\n"; }
在下是个linux小菜,希望边学习c语言能一边学习vim和linux这样学起来稍微慢一些,不过效果很棒棒噢!
欢迎来到我的IT 博客http://www.nightsong.cc
QQ:1623231307
相关文章推荐
- c++入门学习(函数模板)
- 王老师 C++ 函数重载和模板 第二讲
- C++模板之函数模板
- C++中 函数,函数模板,函数对象,函数对象模板 与 回调机制 不得不说的事
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- C++中的函数模板
- C++ class类六个必备函数
- C++箴言:用成员函数模板接受兼容类型
- [C++再学习系列] 函数模板和类模板
- 未解决-深入C++之函数模板
- C++模板的定制一:定制函数模板
- C++模板的定制五:对定制成员函数的补充
- C++ 函数模板和类模板(转)
- C++模板:函数模板和模板函数
- 王老师 C++ 函数重载和模板 第一讲
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 【转】王老师 C++ 函数重载和模板
- C++ 函数模板 二义性 问题