----------------siwuxie095
对象指针
所谓 对象指针,顾名思义,即 用一个指针来指向一个对象
「对象指针,即 指向对象的指针」
看如下实例:
定义一个坐标类:Coordinate,其中有两个数据成员:m_iX 和 m_iY
定义完成后,就可以去实例化它了
如果想从堆中实例化对象,可以使用 Coordinate *p=new Coordinate;,
即 使用 Coordinate 接一个对象指针 *p,来指向一个对象,通过 new 运
算符来实例化对象后,这个对象就会执行它的构造函数
重点说一说,指针 p 和 对象在内存中的相关位置,以及它们的对应关系:
当使用这种方式实例化了一个对象之后,其本质就是在内存中分配出一块空间,
其中存储了 m_iX 和 m_iY,此时,m_iX 的地址和 p 所保存的地址一致,即 p
实际上指向的就是这个对象中的第一个元素
如果要访问元素可以使用指针的方式:p->m_iX 或 p->m_iY,也可以在指针前面
加一个 *,使之变成一个对象,就可以使用点号访问:(*p).m_iX 或 (*p).m_iY
使用时:
如果使用 new 的方式去实例化这块内存空间,会调用构造函数
需要特别强调的是,与 C 语言相比,new 和 malloc 有着本质的不同,
如果使用 new 就可以自动调用相关对象的构造函数,而使用 malloc
则是单纯地分配内存,不会调用相关对象的构造函数
程序:
Coordinate.h:
class Coordinate { public: Coordinate(); ~Coordinate(); //同样的访问限定符可以出现多次 public: int m_iX; int m_iY; }; |
Coordinate.cpp:
#include "Coordinate.h" #include<iostream> using namespace std;
Coordinate::Coordinate() { cout << "Coordinate" << endl; }
Coordinate::~Coordinate() { cout << "~Coordinate" << endl; } |
main.cpp:
#include <stdlib.h> #include "Coordinate.h" #include <iostream> using namespace std;
int main(void) { //从堆中实例化对象指针 //Coordinate *p1 = NULL; //p1 = new Coordinate; //Coordinate *p2 = new Coordinate();//注意两种不同的写法(在默认构造函数情况下) //p1->m_iX = 10; //p1->m_iY = 20; //(*p2).m_iX = 30; //此时*p2是个对象 //(*p2).m_iY = 40; //cout << p1->m_iX + (*p2).m_iX << endl; //cout << p1->m_iY + (*p2).m_iY << endl; //delete p1; //p1 = NULL; //delete p2; //p2 = NULL;
//从栈中实例化对象 Coordinate p1; // 对象指针p2指向p1(使用取地址符&),这样就可以 // 通过p2操纵p1的数据成员和成员函数 Coordinate *p2 = &p1; p2->m_iX = 10;//(*p2).m_iX=10; p2->m_iY = 20;//(*p2).m_iY=20; cout << p1.m_iX << endl; cout << p1.m_iY << endl; system("pause"); return 0; } |
【made by siwuxie095】