大家应该还记得,在之前的博客中,我们使用了两种实例化对象的方法,一个是从栈中,另一个是从堆中。其中,从堆中实例化对象的方法是这样的:
Stutent *p = new Student();
之前我们并没有细说这一个语句的具体意思。下面就来给大家解释一下。等号左边我们定义了一个Stutent类型的指针p,然后在等号右边,用new运算符向系统申请了一段内存,然后让p指针指向这段内存,这段内存存放的就是Student类的一个对象。此时,由于p指针指向的是一个对象,所以我们将它称为“对象指针”。
通过这样的方式完成实例化对象之后,如果想要访问对象中的数据成员或者成员函数,可以使用两种方法,我们假设类中有公有数据成员m_iX和成员函数setX():1.p->m_iX,p->setX(),这样的访问方式我们在之前就经常用到,中间用的是一个指向符号;2.(p).m_iX,(p).setX(),我们之前没有介绍过这样的访问方式,但是大家应该也能类比我们之前从栈中实例化对象的访问方法,在这里,(*p)就代表了一个对象。
定义一个指针对象,不仅可以指向一个刚刚申请了内存空间的新的对象,还可以指向之前已经实例化完成的对象,比如像这样:
Stuent stu;
Student *p = stu;
这样,我们就让指针p指向了对象stu,之后我们用p指针访问对象中的成员,和用stu访问对象中的成员效果一样。值得注意的是,由于第二行定义指针时并没有实例化新的对象,所以在执行这一句代码时不会调用构造函数。而且在最后,也不需要使用delete去释放空间,因为我们根本没有向系统申请内存。
以上就是有关对象指针的内容,下一篇我将介绍对象成员。