学C++已经有一段时间了,随后的日子却抛到了一边,少有接触和运用到。
这次想重头温习一下,却一下子没有了头绪,都不知道从何处着手。相比C,C++称之为C的超集,所有的C功能都可以在C++运用,相反C++却多出了几个特性:模板编程(泛型?呵呵,泛型与模板是有区别的啦)、OPP编程(类class).
这里只想说一点模板编程的东西。
还是举个简单的例子来说吧,如要求输出2个数中的最大的一个数的功能函数:OutMax.
在传统的C里面要如何实现呢?如两个整形,则会定义成如下:
void OutMax(int param1,int param2){
if(param1>=param2)
cout<else
cout<}
但是这个函数只能接受两个整形的参数,如果要比较两个浮点型的呢??或者在整形与浮点型之间进行比较,而且我们也不知道地个参数在前,那个参数在后!!
在C++里,我们就可以用上了模板编程了……,如下:
template
void OutMax(T1 param1,T2 param2){
if(param1>=param2)
cout<else
cout<}
注意这里的template,这是模板定义的关键字,然后在后面的”<>“里定义模板函数需要的类型,这时是T1和T2,前面用关键字typename标明。
好了,下面是一个完整的测试程序:
#include
using namespace std;
template
void OutMax(T1 param1,T2 param2){
if(param1>=param2)
cout<else
cout<}
int main(){
OutMax(1,3);
OutMax(5.3,3.2);
OutMax(45,78.12);
return 0;
}
我们编译运行一下,OK,编译和运行一切正常:
E:\Programming\c_cpp>cpptemp
3
5.3
78.12
现在我们用IDA来反分析一下:
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 push 3
.text:00401005 push 1 ; double
.text:00401007 call sub_401040
.text:0040100C fld ds:dbl_41B1C0
.text:00401012 fstp [esp+8+var_8]
.text:00401015 sub esp, 8
.text:00401018 fld ds:dbl_41B1B8
.text:0040101E fstp [esp+10h+var_10]
.text:00401021 call sub_402270
.text:00401026 add esp, 8
.text:00401029 fld ds:dbl_41B1B0
.text:0040102F fstp [esp+8+var_8]
.text:00401032 push 2Dh ; int
.text:00401034 call sub_4022D0
.text:00401039 add esp, 0Ch
.text:0040103C xor eax, eax
.text:0040103E pop ebp
.text:0040103F retn
上面的是main函数,对同一个函数的调用成了对三个子函数的调用:
1、.text:00401007 call sub_401040
2、.text:00401021 call sub_402270
3、.text:00401034 call sub_4022D0
呵呵,模板编程的功能是在编译端实现和支持的,是编译器根据实际需要生成相应的子函数!