版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/84979726
函数指针
1、概念:与数据项相似,函数也有地址,函数的地址是存储其机器语言代码的内存的开始地址。获取函数的地址很简单:只要使用函数名(后面不跟参数)即可。也就是说,如果think()是一个函数,则think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。(《C++ Primer Plus 中文版》(第五版 p216))
2、声明函数指针:double(*pf)(int),即声明了一个函数指针,这个指针指向的函数是:参数为int,返回值为:double
3、赋值和调用
#include <iostream>
using namespace std;
double func(int a)
{
cout<<a<<endl;
}
int main()
{
double (*p)(int);
p = func;
p(10);
}
// 输出10
或用typedef定义
#include <iostream>
using namespace std;
typedef double (*P)(int);
double func(int a) {
cout<<a<<endl;
}
int main()
{
P p=func;
p(10);
// (*p)(10) //结果一样
}
// 输出10
注:上面的例子中,p(10)和(*p)(10)等价。
函数模板和函数指针
可以使用函数模板对函数指针进行初始化或赋值,这样做的时候,编译器使用指针的类型实例化具有适当模板实参的模板版本(《C++ Primer 中文版》(第四版 p539))这句话我看了好几遍,写的实在太难理解了,我的理解:用函数模板对函数指针进行初始化或赋值的时候,编译器就可以找一个合适的函数进行调用。。。。
/*
* 下面这个例子是说,func里面要传递不同的参数,但是在执行里面代码之前,要先判断传进来的参数的大小
* 如果把函数模板放入两个函数,然后进行重载,会出现代码的部分冗余,因此这里考虑用模板把公共操作提出来
*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 定义一个函数模板
template<typename T>
int compare(const T &t1, const T &t2){
return t1>t2? 1: 0;
}
// 两个同名的函数,第一个参数都是函数指针
void func(int(*F)(const int&a, const int&b), int a, int b){
if(F(a, b)) cout<<"int 1"<<endl;
else cout<<"int 2"<<endl;
}
void func(int(*F)(const double&a, const double&b), double a, double b){
if((*F)(a, b)) cout<<"double 1"<<endl;
else cout<<"double 2"<<endl;
}
int main()
{
int a = 10, b = 20;
double c = 30.0, d = 20.0;
func(compare<int>, a, b);
func(compare<double>, c, d);
}
/*
int 2
double 1
*/
模板编译模型
1、包含编译模型:编译器必须看到用到的所有模板的定义。一般而言,可以通过在声明函数模板或类模板的头文件中添加一条 #include 指示使定义可用,如下:
main.cpp
/*
* 下面这个例子是说,func里面要传递不同的参数,但是在执行里面代码之前,要先判断传进来的参数的大小
* 如果把函数模板放入两个函数,然后进行重载,会出现代码的部分冗余,因此这里考虑用模板把公共操作提出来
*/
#include <iostream>
#include <vector>
#include <string>
#include "new_h.h"
using namespace std;
// 定义一个函数模板
int main()
{
int a = 10, b = 20;
double c = 30.0, d = 20.0;
func(compare<int>, a, b);
func(compare<double>, c, d);
show();
show();
}
/*
int 2
double 1
*/
new_h.h
#ifndef NEW_H_H
#define NEW_H_H
#include <iostream>
using namespace std;
void show();
#include "learn_temp.cpp"
template <typename T> int compare(const T&, const T&);
void func(int(*F)(const int&a, const int&b), int a, int b);
void func(int(*F)(const double&a, const double&b), double a, double b);
#endif
learn_temp.cpp
template <typename T> int compare(const T&a, const T&b){
return a>b?1:0;
}
test1.cpp
#include "new_h.h"
void show(){
cout<<"show"<<endl;
}
void func(int(*F)(const int&a, const int&b), int a, int b){
if(F(a, b)) cout<<"int 1"<<endl;
else cout<<"int 2"<<endl;
}
void func(int(*F)(const double&a, const double&b), double a, double b){
if((*F)(a, b)) cout<<"double 1"<<endl;
else cout<<"double 2"<<endl;
}
结果:
int 2
double 1
show
show