有关对象的指针
1.指向对象的指针
-
对象空间的起始地址就是对象的指针,可以定义一个指针变量,用来存放对象的指针
-
定义指向类对象的指针变量的一般形式为
类名 *对象指针名;
2.指向对象成员的指针
2.1 指向对象数据成员的指针
- 定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量的方法相同,其一般形式为
数据类型名 指针变量名;
- 不能指向private数据成员
2.2 指向对象成员函数的指针
- 指向\(普通函数\)的指针变量的定义方法:
数据类型名 (*指针变量名)(参数列表)
void (*p)()=fun; //定义指向void型函数的指针变量,将fun函数的入口地址赋给指针变量p
(*p)(); //调用fun函数,括号不能省略
- 定义一个指向\(对象成员函数\)的指针变量则有所不同,在于它是类中的一个成员。
采用如下形式定义:
数据类型名 (类名::*指针变量名)(参数列表)
使指针变量指向一个公用成员函数的形式为:
指针变量名 = &类名::成员函数名
调用某个类对象中指针变量所指的成员函数的形式为:
(对象名.*指针变量名)(参数列表); //()的优先级高于*,括号不能省略
成员函数不是存放在对象的空间中的,而是存放在对象外的空间中的。如果有多个同类的对象,它们公用同一个函数代码段。从逻辑的角度而言,通过对象名调用成员函数,而成员函数的入口地址是物理的,它是和类而不是对象相联系的,因此成员函数的入口地址应为:
&类名::成员函数名
- 不能指向private成员函数
#include<iostream>
using namespace std;
//定义一个简单的Time类
class Time
{
public:
Time(int=0,int=0,int=0,int=8); //使用默认参数的构造函数
void printTime();
int timezone;
private:
int hou;
int min;
int sec;
};
//Time::Time(int h=0,int m=0,int s=0):hou(h),min(m),sec(s){} //有默认参数的构造函数,用参数初始化列表对数据成员初始化
Time::Time(int h,int m,int s,int tz)
{
hou=h;
min=m;
sec=s;
timezone=tz;
}
void Time::printTime()
{
cout<<hou<<":"<<min<<":"<<sec<<endl;
}
int main()
{
//定义指向Time类对象的指针变量
Time t1;
Time *ptr1=&t1;
ptr1->printTime();
t1.printTime();
//定义指向成员函数的指针
void (Time::*ptr2)()=&Time::printTime;
(t1.*ptr2)();
//定义指向数据成员的指针
int *ptr3=&t1.timezone; //ok,timezone为public
cout<<*ptr3;
int *ptr4=&t1.hou; //error:无法访问 private 成员(在“Time”类中声明)
return 0;
}
3.this指针
-
在每一个成员函数中都包含一个名为\(this\)的特殊指针,它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
-
\(this\)指针是隐式使用的,它是作为参数被传递给成员函数的,当属于同一个类的不同对象的成员函数引用数据成员时,就是靠\(this\)指针保证引用的是所指定的对象的数据成员。
-
调用对象a的成员函数f,实际上是在调用成员函数f时使\(this\)指针指向对象a,从而访问对象a的成员。