函数指针与类成员函数指针

1,函数指针
函数指针,顾名思义就是函数的指针,而指针其实就是地址,那么函数指针就是存储函数的地址,可是实际大部分时间里,我们写程序时是根本不会去考虑函数地址在哪里。我们只需要知道函数原型和函数声明就可以。但是想象一下,我们总是以为函数就应该接收参数,那么函数本身是否可以作为函数的参数呢?我做了下面的一个实验

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
typedef int (*intFun)(int,int);
int add(int a,int b);
int minus(int a,int b);
int multi(int a,int b);
int fun_choose(intFun,int,int);
int main()
{
intFun pf;
pf=add;
printf("%p\n",pf);
printf("%p\n",add);
cout<<add(5,4)<<endl;
cout<<pf(5,4)<<endl;
cout<<fun_choose(add,5,4)<<endl;//函数名作为参数
return 0;
}
int fun_choose(intFun fun,int a,int b)
{
return(*fun)(a,b);
}
int add(int a,int b)
{
return a+b;
}

从上面的代码中我们可以看出,函数也可以作为参数出入到一个函数中,这样对我们需要处理的一些程序就会很方便,当我们需要在A函数中调用B函数时,我们只需要通过函数指针把B函数传入A函数中即可。虽然我的确没有发现这样有啥好处,但可能就是帅吧。
2.类成员函数指针
下面程序是一些类成员函数指针的实现,其中我们不难发现,我们可以通过已存在的对象去调用类中相应的函数,而不需要对象本身去操作。看起来的确时挺帅的。

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
typedef int (*intFun)(int,int);
class fun1;
typedef int (fun1::*cFun1)(int,int);
typedef void (*voidFun)();
int add(int a,int b);
int minus(int a,int b);
int multi(int a,int b);
int fun_choose(intFun,int,int);
class fun1{
public:
static void output()
{
cout<<"fun1\n";
}
int fun2(int a,int b)
{
return a+b;
}
};
int cFun_choose(fun1 *f1,cFun1 fun,int a,int b);
int sFun(voidFun fun);
int main()
{
fun1 f1;
intFun pf;
pf=add;
fun1 f;
printf("%p\n",pf);
printf("%p\n",add);
cout<<add(5,4)<<endl;
cout<<pf(5,4)<<endl;
cout<<cFun_choose(&f1,fun1::fun2,5,4)<<endl;
sFun(fun1::output);
return 0;
}
int sFun(voidFun fun)
{
(*fun)();
}
int cFun_choose(fun1 *f1,cFun1 fun,int a,int b)
{
return (f1->*fun)(a,b);
}
int cFun(voidFun fun)
{
(*fun)();
return 1;
}
int fun_choose(intFun fun,int a,int b)
{
return(*fun)(a,b);
}
int add(int a,int b)
{
return a+b;
}

原文地址:https://www.cnblogs.com/linux-bfbdxj520/p/11411449.html

时间: 2024-08-04 16:39:21

函数指针与类成员函数指针的相关文章

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

类成员函数[转]

类成员函数 除了static数据成员,类还可以有static成员函数.静态成员函数只能访问其他的static成员,包括数据成员和成员函数. 例3-38   本例声明了一个内联的static成员函数getN.在例3-35中,我们知道对象和非静态成员函数(包括构造函数和析构函数)可以访问像n这样的static数据成员.在本例中,我们看到static成员函数也可以访问static数据成员.它们的差别是,非static成员函数既可以访问static数据成员,也可以访问非static数据成员:而stati

C++的类成员和类成员函数指针

类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用. 1 class Test 2 { 3 public: 4 void fun(int); 5 void fun(int) const; //重载函数,加一个const限制 6 static void fun

让类成员函数指针成为可调用对象

类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象. 一般情况下调用类成员函数指针: // a.h #ifndef A_H #define A_H #include <iostream> using std::cout; using std::endl; class A{ public:     void print(); }; #endif // a.cpp #include "a.h" vo

C/C++ 类成员函数指针 类成员数据指针

普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*ptr_name)(para_types)" 类数据成员指针: "type class_name::* ptr_name"; C/C++: 1 class Demo 2 { 3 public: 4 Demo():data(100) 5 { 6 7 } 8 int data; 9 i

C++ 面向对象 类成员函数this指针

每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.topval()将访问stock1的对象数据:stock2.topval()将访问stock2的对象数据: 如果希望该方法的两个对象进行对比, 则必须将第二个对象作为参数传递给它.这时候涉及到隐式和显式: top = stock1.topval(stock2); 隐式的访问了stock1, 显示的访问了s

C++ 获取类成员函数地址方法 浅析

C语言中可以用函数地址直接调用函数: void print () { printf ("function print"); } typdef void (*fun)(); fun f = print; f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用: class test { public: void print () { printf ("function print"); } }; 我们同样可以通过定义函数指针来调用如下: type

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,