2024年5月30日发(作者:)

.什么是对象指针

每个变量都占有一定的内存空间,对象同样也需要占用内存空间。对象有数据成员和函数

成员两种成员,但是实际上只有对象的数据成员会占用内存,函数成员则不会。我们可以通

过对象名引用对象,也可以通过对象地址访问对象。对象指针就是存储对象地址的变量。声

明对象指针的方式与一般的指针类似:

每个变量都占有一定的内存空间,对象同样也需要占用内存空间。对象有数据成员和函数成

员两种成员,但是实际上只有对象的数据成员会占用内存,函数成员则不会。我们可以通过

对象名引用对象,也可以通过对象地址访问对象。对象指针就是存储对象地址的变量。声明

对象指针的方式与一般的指针类似:

类名 *对象指针名;

使用对象名可以方便的访问对象的公有成员,同样使用对象指针也可以很容易的访问

对象的公有成员。用对象指针访问对象的公有成员的形式为:

对象指针名->公有成员名;

鸡啄米让大家看一个简单的对象指针的例子:

#include

using namespace std;

class CStudent

{

public:

CStudent(int nAge=15) { m_nAge = nAge; } // 构造函数

int GetAge() { return m_nAge; } // 内联函数,返回m_nAge

private:

int m_nAge; // 私有数据

};

int main()

{

CStudent student(17); // 声明对象student并对其初始化

CStudent *ptr; // 声明对象指针

ptr = &student; // 初始化对象指针

cout << () << endl; // 通过对象名访问对象的成员

cout << ptr->GetAge() << endl; // 通过对象指针访问对象的成员

return 0;

}

跟一般指针一样,对象指针在使用之前也必须先赋值,因为它必须先明确指向一个对

象才能正常使用,否则可能会由于被赋与了随机值而有可能访问到重要地址破坏系统数据。

上面的程序运行结果是:

17

17

二.this指针

this指针实际上就隐含于类的成员函数中,它指向成员函数正在操作的对象。构造函数

和析构函数也不例外,也同样隐含了this指针。它也是一个指针,只是有点特殊。

比如上面的CStudent类的成员函数GetAge中的语句:return m_nAge;对于编译器来

说相当于执行return this->m_nAge;。为什么要有这个this指针呢?因为在执行这条语句时

编译器需要知道返回的m_nAge到底属于哪一个对象,编译器事先已经把对象地址赋给thi

s指针,调用成员函数操作数据成员时就隐含使用了这个this指针,这样就确定了访问的m

_nAge属于哪个对象。

一般在软件开发中不会直接用到this指针访问数据成员,有时需要将此对象作为参数

传递给某个函数时会使用this指针,亦或是写程序时忘记某个函数名,输入this->后vs201

0会提示出所有成员函数。

三.指向类的非静态成员的指针

类的成员都是变量、对象、函数等,我们同样可以定义存放它们的地址的指针,从而

使指针指向对象的成员,通过指针就可以访问对象的成员了。但是通过这种指向成员的指针

一样也只能访问公有成员。

声明指向非静态成员的指针的语法形式为:

类型说明符 类名::*指针名; // 声明指向公有数据成员的指针

类型说明符 (类名::*指针名)(形参表); // 声明指向公有成员函数的指针

指向成员的指针也要先声明再赋值,然后才能引用。给指向成员的指针赋值就是要说

明此指针指向类的哪一个成员。

为指向数据成员的指针赋值的语法形式为:

指针名 = &类名::数据成员名;

在前面的地址相关运算中,鸡啄米讲到,用“&”运算符可以取到变量的地址,将其赋值

给某个指针后就可以通过这个指针访问变量了。但是对于指向类的数据成员的指针就不同了,

在类声明时并不会为类的数据成员分配内存空间,所以给指向数据成员的指针赋值只是确定

了此指针指向哪个数据成员,同时也在指针中存放了该数据成员相对于类的起始地址的地址

偏移量。这时通过赋值后的指针不能访问到具体的数据成员。

在声明了类的对象后就会为对象分配内存,这样根据对象的起始地址和指向数据成员

的指针中存放的偏移量就可以访问到对象的数据成员了。通过对象和指向数据成员的指针访

问公有数据成员的语法形式为: