对象指针

----------------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】

原文地址:https://www.cnblogs.com/siwuxie095/p/6795767.html