- 指向对象的指针:类名 *指针变量名=初值(对象地址); 可以通过指向对象的指针间接访问对象、对象成员。如:
class Time { public: Time(int h = 0, int m = 0, int s = 0) :hour(h), minute(m), second(s) {} void set(int h = 0, int m = 0, int s = 0) { hour = h, minute = m, second = s; } int hour, minute, second; }; int main() { Time now(12, 0, 0),*pt; pt = &now; now.hour=1;// pt->hour=1;// (*pt).hour=1;// //以上相关语句等价 return 0; } - 指向对象成员的指针:数据成员类型 *指针变量名=初值;如下所示(数据成员必为public)
int *ph=&now.hour;//定义一个指针变量ph指向对象now的数据成员hour - 类成员指针:
- 数据成员指针:数据成员类型 类名::*指针变量名 = &类名::数据成员;
- 成员函数指针:返回类型 类名::*指针变量名(形式参数表)= &类名::函数名; 必须满足:返回类型相同,形参类型数目相同(包括const),所属类类型相同
- 类成员指针的使用:类类型的对象.*成员指针 或 类类型的指针->*成员指针
指向对象成员的指针指向的是具体的某个对象,而类成员指针指向的是类的成员,二者不同。
指向类的数据成员的指针并非指针,因为它既不包含地址,行为也不像指针。与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向一个特定对象里的特定成员。通常最清晰的做法是将指向数据成员的指针看作为一个偏移量。 C++标准并没有说该如何实现指向成员的指针,大多数编译器都将指向数据成员的指针实现为一个整数,其中包含被指向成员的偏移量。这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少个字节。一个类成员的偏移量在任何对象中都是相同的。【补足基础】指向类的成员的指针_sunnyorange的博客-CSDN博客
//关于数据成员指针和成员函数指针
class A
{
public:
A(int i)//带一参的构造函数
{
a = i;
}
int fun(int b)//类的函数成员
{
return a*b+c;
}
int c;//类的数据成员(公有)
private:
int a;//类的数据成员(私有)
};
int main()
{
A x(8);//定义一个类A 的对象x
A y(9);
int A::* pc;//定义指向类A的数据成员的指针pc
pc = &A::c;//给指针pc赋值,为类A的公有数据成员c
x.*pc = 3;//用指针方式给类成员c赋值为3()
y.*pc = 4;
cout << "x.*pc=" << x.*pc << endl;
cout << "y.*pc=" << y.*pc << endl;
x.c=5; //二者等价
y.c = 6;
cout << "x.*pc=" << x.*pc << endl;
cout << "y.*pc=" << y.*pc << endl;
cout << "x.c=" << x.c << endl;
cout << "y.c=" << y.c << endl;
cout << "pc=" << pc << endl;
cout << "&(x.*pc)=" << &(x.*pc) << endl;
cout << "&(y.*pc)=" << &(y.*pc) << endl;
cout << "&(x.c)=" << &(x.c) << endl;
cout << "&(y.c)=" << &(y.c) << endl;
int (A:: * pfun)(int);//定义指向类A的成员函数的指针pfun
pfun = &A::fun;//类成员指针pfum赋值,指向类A 的成员函数fun
A* p = &x;//定义一个类型为A的对象指针,指向对象x
cout << (p->*pfun)(5) << endl;
return 0;
}
输出:
x.*pc=3
y.*pc=4
x.*pc=5
y.*pc=6
x.c=5
y.c=6
pc=1
&(x.*pc)=00D5F934
&(y.*pc)=00D5F924
&(x.c)=00D5F934
&(y.c)=00D5F924
45
4.this指针
除了静态成员函数以外的成员函数都有隐式的形参this,指向调用该函数的对象的地址。
使用this指针的几种情况:
- 当参数与数据成员名相同时使用,如this->hour=hour(不能用hour=hour)
- 在非静态成员函数中要返回调用该函数的对象时,直接用return *this;
- this指针不能显式定义,但可以显示调用
- 不可改变this指针的指向(对象),不可改变this指针指向内容(对象的内容)
版权声明:本文为m0_62556296原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。