【日志】c++ 函数指针

  • 函数指针
    一、普通函数指针
// 函数定义
int myFunc(const string& s1, const string& s2){   ;}
// 初始化 1
int (* my_func)(const string&, const string&) = myFunc;
// 初始化 2
typedef int (*myFuncType)(const string&, const string&);
myFuncType my_func = myFunc;

// 赋值1 &2
myFuncType my_func = myFunc;
myFuncType my_func = &myFunc;

// 调用 1&2
myFunc("abc", "z");
my_func("abc", "z") ;

// 函数指针的数组 1& 2
int (*my_func_array[3])(const string&, const string &);
//with typedef
myFuncType my_func_array[3];

//函数指针用作函数返回值的类型 1&2
 int (*new_func(int*, int))(const string&, const string &);
 myFuncType new_func(int* ,int);//tpyedef 很好用

二、 指向类成员的指针

  • (1)指向类的普通成员的指针(非静态

1.1 指向类成员函数的指针

简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。
typedef 返回值 (**类名:: **指针类型名)(参数列表);

//与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可 声明
class A;
typedef void (A::*myFuncType)(int);

class A{
public: void memberFunc(int arg){;}
};
int main()
{
	// 赋值 类的成员函数地址赋值 不可缺少&
	myFuncType my_func = &A::memberFunc;
	// 调用 通过对象& 指针 
	A a;
	(a.*my_func)(10);
	
	A *afun = new A;
	(afun->*my_func)(10);
	return 0;
	
}

1.2 指向类数据成员的指针

class A;
typedef int (A::*myDataType);

class A{
public: 
	A(int arg): memberData(arg){} 
	int memberData;
};
int main()
{
	// 赋值 类的成员函数地址赋值 不可缺少&
	myDataType my_data = &A::memberData;
	// 调用 通过对象& 指针 
	A a(10);
	cout<< a.*my_data ;
	
	A *adata = new A(100);
	cout<< adata->*my_data;
	return 0;
	
}
  • (2)指向类的静态成员的指针

类的静态成员和普通成员的区别在于,他们是不依赖于具体对象的,所有实例化的对象都共享同一个静态成员,所以静态成员也没有this指针的概念。
所以,指向类的静态成员的指针就是普通的指针

class A;
// 同普通指针
typedef int (*myFuncType)();
typedef const int *myDataType;

class A{
public: 
	static int myFunc() {return memberData;};
	static const int memberData = 10;
};
int main()
{
	
	myFuncType my_func = &A::myFunc;
	myDataType my_data = &A::memberData;
	// 直接引用
	cout<< *my_data ;
	cout<< (*my_func )();
	return 0;
	
}

总结:

1)静态的和普通的函数指针没区别;

2)非静态的加一个类局限一下即可。

参考文章:
https://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html
https://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值