C++学习笔记 -类成员指针
如果将一个函数指针指向一个类的成员函数,是非法的,即使该函数指针的返回类型以及函数的参数列表都是和成员函数理致的,也是不能实现的。但是可以定义类成员的指针,这种指针可以指向类的数据成员和成员函数。可以使用C++指针直接访问类中的成员。
数据成员指针:指针是某个变量的起始地址值,这个变量可以是一般数据类型的变量,也可以是类对象的数据成员。数据成员指针严格意义上说不能算作指针,因为数据成员指针在类中表示的只是一个偏移量,它表示的是该数据成员相对于具体对象的起始地址的距离。
# include
using namespace std;
class Transport
{
public:
Transport(double s,double w)//构造函数初始化
{
speed=s;
weight=w;
}
virtual ~Transport()//虚析构函数
{
cout<<"in Transport Deconstructor"<<endl;
}
double speed;
double weight;
};
typedef double Transport::*pdoube;//数据成员指针
void main()
{
Transport t(88.8,1234.56);//定义对象
pdoube pd=&Transport::speed;//数据成员指针指向类的成员
printf ("pd=%d\n",pd);//输出偏移量
cout<<"speed is :"<<t.*pd<<endl;//访问具体对象
pd=&Transport::weight;
printf("pd=%d\n",pd);
cout<<"weight is :"<<t.*pd<<endl;
}
成员函数指针:成员函数指针和一般的函数指针也是不一样的,成员函数指针涉及类的信息,对于这一点成员函数指针和数据成员指针有类似之处。
#include
using namespace std;
class Transport
{
public:
virtual void setspeed(int s)
{
speed=s;
}
virtual void transport()
{
cout<<"basic transport in "<<SPEED<<ENDL;< p>
}
protected:
int speed;
};
class Car:public Transport
{
public:
void setspeed(int s)
{
speed=s;
}
void transport()
{
cout<<"Car transport in "<<SPEED<<ENDL;< p>
}
};
class Train:public Transport
{
public:
void setspeed(int s)
{
speed=s;
}
void transport()
{
cout<<"Train transport in "<<SPEED<<ENDL;< p>
}
};
typedef void (Transport::*ptransport)();
typedef void (Transport::*psetspeed)(int);
void print(Transport &t,ptransport(pf))
{
(t.*pf)();
}
void main()
{
ptransport pf=&Transport::transport;
psetspeed ps=&Transport::setspeed;
Transport ts;
(ts.*ps)(0);
Car c;
Train t;
Transport *pt;
pt=&c;
(pt->*ps)(60);
pt=&t;
(pt->*ps)(180);
print (ts,pf);
print (c,pf);
print(t,pf);
}