首先一个简单的问题,如何实现交换两个整数的值? 想必每个有编程经验的人都能作答。
C语言用指针实现如下:
void swap(int * a, int * b){ int tmp = *a; *a = *b; *b = tmp; }
C++可以使用引用实现如下:
void swap(int & a, int & b){ int tmp = a; a = b; b = tmp; }
顺便记录另外两个很有意思的实现,不用中间变量tmp (面试中可能会问到):
void swap(int & a, int & b){ a = a + b; b = a - b; a = a - b; }
void swap(int & a, int & b){ a = a ^ b; b = a ^ b; a = a ^ b; }
然后,言归正传,假如需要实现任意相同类型两数交换值应该怎么办呢? 比如需要交换两整数、两浮点数或者两个字符。这时,为每种情况编写函数实现显得冗余, 可以采用泛型编程的方法。C语言中泛型编程需要用到 void*(指向任意类型的指针), C++中则采用函数模板。
新问题的C语言实现如下:
void swap(void * a, void * b, int size){ char * tmp = malloc(size * sizeof(char)); memcpy(tmp, a, size * sizeof(char)); memcpy(a, b, size * sizeof(char)); memcpy(b, tmp, size * sizeof(char)); free(tmp); }
注意:无法对void*直接解引用,所以函数参数需要额外一个size参数标示出 void *指向的数据类型的大小。 相关详细内容可以参考 http://blog.csdn.net/skyline0623/article/details/6164011
新问题的C++函数模板实现如下:
template<class T> void swap(T & a, T & b){ a = a + b; b = a - b; a = a - a; }
注意:如果使用C++中的函数模板,很有可能碰到一处很特别的问题,就是如果在函数头文件中只声明,而在swap.cpp中实现的话,需要在声明后再包含.cpp文件, 如
//swap.h template<class T> void swap(T & a, T & b); #include "swap.cpp"
//swap.cpp template<class T> void swap(T & a, T & b){ a = a + b; b = a - b; a = a - b; }
否则编译会报错。还有一种是在.cpp中加入关键字export, 参加http://blog.csdn.net/laixingjun/article/details/8992680
最好的方法是,将函数模板的定义直接放在头文件中,不要在.cpp文件中。