首页 > 代码库 > C++学习研究之对象指针

C++学习研究之对象指针

一、指向对象的指针

在建立对象时,编译系统会为每一个对象分配一定的存储空间,用来存放它的成员。对象空间的起始地址就是对象的指针。所以我们可以定义一个指针变量来存放对象的指针。

如有一个类  class Time {...} ,可以有

1 Time *ptr;  //类名 *指针对象名2 3 Time time;4 5 ptr = &time; 

 这样,ptr就是指向Time类对象的指针变量。

 

二、指向对象成员函数的指针

 由于指向对象的数据成员的指针变量的方法和指向普通变量的指针变量的方法相一致,就不介绍了。

指向普通函数的指针变量的定义方法为:

数据类型名 (* 指针变量名)(参数表列)

如  void (* ptr1) ( );    //表明ptr是指向void类型的指针函数。它可以指向一个函数void fun( ),然后用指针变量调用这个函数。

1 ptr1 = fun;2 (*ptr1)( );

 而对于一个指向对象成员函数的指针变量要稍微复杂一点。其定义方式是

数据类型名 (类名:: * 指针变量名)(参数表列)

如 void (Time:: * ptr2)( );   //表明定义ptr为指向Time类中公用成员函数的指针变量

ptr2 = &Time::getTime;    //它是指向Time类中的一个函数,而不是Time类对象的具体函数

                //这是因为成员函数不是存放在对象的空间的,而是存放在对象外的空间的

                //如果有多个同类的对象,它们公用一个函数代码段

                //因此赋给指针变量的应该是这个公用的函数代码段的入口地址

 1 #include <iostream> 2  3 class Time 4 { 5 public: 6     Time(int h, int m, int s):hour(h), minute(m), second(s){} 7     ~Time(){} 8     void getTime(); 9 10     int hour;11     int minute;12     int second;  13 };14 15 void Time::getTime()16 {17     std::cout << hour << ":" << minute << ":" << second << std::endl;  18 }19 20 int main()21 {22     Time time(7, 24, 12);23     int *ptr1 = &time.hour;24     std::cout << *ptr1 << std::endl;25 26     time.getTime();27     Time *ptr2 = &time;28     ptr2->getTime();29 30     void (Time:: *ptr3)();31     ptr3 = &Time::getTime;32     (time.*ptr3)();33 34     return 0; 35 }

 三、this指针

由于每个对象中的数据成员是分别战友存储空间的,当同一个类定义了n个对象时,则有n组同样大小的空间存放n个对象的数据成员,但是呢,不同的对象都是在调用同一个函数代码段。那么问题来了,当不同的对象的成员函数引用数据成员时,怎样才能保证引用的是所指定的对象的数据成员呢?

其实在每一个成员函数中都包含一个特殊的this指针。它是指向奔雷对象的指针,其值是当前被调用的成员函数所在对象的起始地址。this指针是隐式使用的,它是作为参数被传递给成员函数的。 

 

C++学习研究之对象指针