• 对象指针


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

  • 相关阅读:
    13 110内容回、111内容回顾、redis操作
    11 git第二部分(未完成)
    10 内容回顾和补充、分页加密
    09 深科技相关表结构 (未完成)、git
    $ python manage.py makemigrations You are trying to add a non-nullable field 'name' to course without a default; we can't do that (the database needs something to populate existing rows). Please selec
    6、DockerFile解析:三步走、保留字指令
    Linux 中各个文件夹的作用
    H.264 Profile-level-id
    H.264编码profile & level控制
    H.264分层结构与码流结构
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6795767.html
Copyright © 2020-2023  润新知