对象指针

  1. 指向对象的指针:类名 *指针变量名=初值(对象地址);  可以通过指向对象的指针间接访问对象、对象成员。如:
    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;
    }
  2. 指向对象成员的指针:数据成员类型 *指针变量名=初值;如下所示(数据成员必为public) 
    int *ph=&now.hour;//定义一个指针变量ph指向对象now的数据成员hour
  3. 类成员指针:                                                                                                                           
  • 数据成员指针:数据成员类型 类名::*指针变量名 = &类名::数据成员;
  • 成员函数指针:返回类型 类名::*指针变量名(形式参数表)= &类名::函数名;  必须满足:返回类型相同,形参类型数目相同(包括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版权协议,转载请附上原文出处链接和本声明。