在C++中,我们访问对象的数据成员,特别是私有数据成员,一般是通过类的结构函数来进行。除此而外,我们可以通过指针来访问。假设有这样一个类:
class Base{
public:
Base(double a,int b){
_a = a;
_b = b;
};
private:
double _a;
int _b;
};
对类的一个实例base,我们通过指针来操纵base的数据成员_a,_b步骤如下:
(1)获得对象base在内存中的地址address,方法(&base)
C++中本身对对象取引用(&base)就是转换成相应的指针,类型为(Base*),如果我们想操纵_a,_b,必须对其进行类型转换。
(2)转换成相应数据成员类型的类型,对double型转换成类型为double*的指针,对int型转换成类型为int*的指针。
(3)通过指针的解引用,获得数据。
如下我们分别取对象base的_a,_b的值
取_a:
(1)得到对象base的的数据成员_a在内存中的地址(&base)
(2)进行类型转换(double*)(&base)
(3)解引用*(double*)(&base)
即得到_a的数据值。如果我们想接着取_b的值:
(1)得到对象base的数据成员_b在内存中的地址((double*)(&base)+1)
(2)进行类型转换(int*)((double*)(&base)+1)
(3)解引用*(int*)((double*)(&base)+1)
完整程序如下:
#include <iostream>
using namespace std;
class Base{
public:
Base(double a,int b){
_a = a;
_b = b;
};
private:
double _a;
int _b;
};
int main()
{
Base base(20.5,30);
cout<<"对象base地址:\t"<<(&base)<<endl;
cout<<"对象base的_a的值:\t"<<(*(double*)(&base))<<endl;
cout<<"对象base的_b的值:\t"<<(*(int*)((double*)(&base)+1))<<endl;
return 0;
}