#include<cstring>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
class Date
{
public:
int day,month,year;
void init(int,int,int );
void print();
};
void Date::init(int yy,int mm,int dd)
{
year=yy;
month=mm;
day=dd;
}
void Date::print()
{
cout<<year<<" "<<month<<" "<<day<<endl;
}
int main()
{
Date date1;
date1.init(2,2,2);
Date *date2;
date2=new Date;//注意申请空间,当定义一个指针类时,需申请空间,但是(Person p)时,这个时候不需要申请空间
date2->init(1,1,1);
date2->print();//指向对象的指针,输出结果是1 1 1
int *t2;
t2=&date1.month;
cout<<*t2<<endl;//普通变量的指针,输出结果是2
Date *p1=&date1;
p1->init(2005,3,28);
p1->print();
int *p2;
p2=&date1.year;
cout<<*p2<<endl;
void(Date::*p3)(int,int,int );//指向成员函数的指针。
void(Date::*p4)();
p3=&Date::init;//这个地方注意加上取地址符,课本上错了
p4=&Date::print;
(date1.*p3)(2006,4,8);
(date1.*p4)();
return 0;
}
具体声明一个指向成员函数的指针的时,我觉得可以分为三部分.
第一部分,声明。
函数的返回值类型(类名::指针变量名)目标函数的参数。
ex:void (Date::*p1)(int ,int ,int );
第二部分,指向(我自己编的名字,不用在意这些细节)。
指针变量名=& 类名::函数名(不带参数)。
ex:p1=&Date::init;
第三部分,赋值
(申请的类的名称.指针变量名)(1 ,1,1);
ex:(date1.*p)(1,1,1);
ps:在定义新的变量或者类时,使用指针定义和直接定义在使用成员函数的时候是不一样的。
如果是定义的这种,Person *p1,在使用类的成员函数的时候,使用->进行访问(p1->print())。如果是这样定义的,Person p1,使用"."进行访问(p1.print())(不一定对,我是这样理解的)。
但是,this指针就比较特殊,好像两种都行,并且使用方法还反着。。。
上代码:
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
class Test{
int x;
public:
Test(int =0);
void print();
};
Test::Test(int a){x=a;}
void Test::print(){
cout<<x<<endl;
cout<<this->x<<endl;
cout<<(*this).x<<endl;
}
int main(){
Test q(12);
q.print();
return 0;
}
输出结果都是 12