首页 > 编程 > C++ > 正文

文章标题 C++成员变量以及成员函数指针

2019-11-06 07:27:45
字体:
来源:转载
供稿:网友

类的成员变量指针和成员函数指针作为一种特殊的指针类型,在c++语法中有着特殊的使用方式和实现机制 这里有两个基本要点 *****1/成员变量指针本质上就是在类的声明中,变量在类中的相对地址. 2/成员函数既然是函数,代表的就是一个地址,一个绝对地址* 那么我们可以做一个简单的实验来探索这种机制:

/*main.cpp*/#include <iostream>#include <cstring>using namespace std;class Time{public: void showtime(void) const { cout << "时间 " << year << ',' << month << ',' << sec << endl; } Time (int year1,int month1,double sec1) : year(year1),month (month1),sec(sec1){ cout << "构造函数" << endl; }public: int year; int month; double sec;};int main(){/*我们尝试使用成员变量指针,并将变量的值打印出来*/int Time::*p_year = &Time::year;int Time::*p_month = &Time::month;double Time::*p_sec = &Time::sec;/*存储成员变量的值 容器*/int copy = 0;memcpy(&copy,&p_year,sizeof(p_year));cout << copy << endl;memcpy(&copy,&p_month,sizeof(p_month));cout << copy << endl;memcpy(&copy,&p_sec,sizeof(p_sec));cout << copy << endl;/*探究成员函数*/void (Time::*p_show) (void) const = &Time::showtime;Time t1(2017,3,0.1), *p1 = &t1;Time t2(2017,3,0.2),*p2 = &t2;/*调用成员函数*/(t1.*p_show) ();(p1->*p_show) ();(t2.*p_show) ();(p2->*p_show) ();return 0;}/*g++ main.cpp./a.out 运行输出:048构造函数构造函数时间 2017,3,0.1时间 2017,3,0.1时间 2017,3,0.2时间 2017,3,0.2那么结果就很明显了,成员变量year month sec相对Time类声明相对地址依次是 0(首地址), (隔着一个int)4,(隔着两个int)8,对于c++编译器来说使用成员变量指针就会通过某一个对象的首地址通过和这个相对地址相加,计算出变量的绝对地址成员函数既然是绝对地址,为什么需要使用这种另类的声明方法呢?和C语言一样直接声明一个函数指针,调用的时候传递参数不就ok了吗?这个实际上比较简单,因为this指针啊,C++类中实现的非静态成员函数是有一个隐含的参数(形参this 类类型 *),所以使用成员函数的声明形式就是为了这个this指针.*/
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选