C++ 对象指针(函数指针)
1、指向对象的指针:
对象的起始地址就是对象的指针,可以定义一个指针变量用来存放对象的指针;
class Time
{
public:
int hour;
int minute;
int sec;
void get_time();
};
void Time::get_time()
{
cout<<hour<<":"<<minute<<":"<<sec;
}
Time *pt; //定义pt为指向Time类对象的赋值指针变量
Time t1; //定义t1为Time类的对象
pt = &t1; //将t1起始地址赋给pt;
*pt 此时pt指向的对象已经是t1了;
(*pt).hour 指向对象中的hour成员
pt->hour;
2、指向对象成员的指针:
指向对象数据成员:
一般形式------数据类型名 *指针变量名;
同上面的例子:他如果time是公用数据类型,就可以通过把time指定为指针
在类外通过指针对象数据成员来访问hour;
pl = &t1.hour;
cout<<*pl;
指向对象成员函数的指针
需要注意的是,定义执行对象成员函数的指针变量的方法,和定义普通函数的指针变量方法是不同的!!!
普通函数指针变量定义
数据类型名(*指针变量名)(参数列表);
void(*p)(); //P是指向void型函数的指针变量
这样定义的函数指针变量可以用来指向一个函数,并且调用函数;
p= fun; //将fun函数的入口地址赋值给指针变量p;
(*p)(); //调用fun函数
对象成员函数的使用就没有这么简单了,
首先来看一下成员函数和普通函数的区别;
成员函数是类的一个成员,指针变量的类型必须与赋值号右侧的函数类型相匹配
1、函数参数的类型韩参数个数;
2、函数返回值的类型
3、所属的类
综上所述定义对象成员函数的具体方法是
void (TIme:: *p2)(); //定义p2为指向time类中公有成员函数的指针变量
(Time:: *p2) 两侧的括号不能省略,因为()的优先级高于*
定义成员函数的指针变量的一般形式为;
数据类型名(类名:: *指针变量名)(参数列表);
可以让他指向一个公有成员函数,把成员函数的入口给他就可以了
比如:
p2 = &Time:: get_time;
使指针变量指向一个公有成员函数的一般形式为
指针变量名 = &类名::成员函数名;
其实总结起来就是,在每个成员函数的前面加上类就可以啦!!!也就这点不同!!
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
int hour;
int minute;
int sec;
void get_time(); //声明公有成员函数
};
Time::Time(int h=10,int m=20,int s=10)
{
hour = h;
minute = m;
sec = s;
}
void Time::get_time() //定义公有成员函数
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;;
}
int main (int argc, const char * argv[])
{
Time t1(10,20,50); //定义类对象
int *p1 = &t1.hour; //定义整形数据的指针变量p1并使p1指向t1.hour
cout<<*p1<<endl;
t1.get_time(); //调用对象t1的成员函数get_time
Time *p2 = &t1; //定义指向time类的指针变量p2并指向t1;
p2->get_time();
void (Time::*p3)(); //定义指向time类公有成员函数p3;
p3 = &Time::get_time; //p3指向类公有成员函数get_time
(t1.*p3)(); //调用函数
return 0;
}