zoukankan      html  css  js  c++  java
  • 对象成员指针

    -------------------siwuxie095

       

       

       

       

       

       

       

       

       

       

    对象成员指针

       

       

    对象成员指针,即 对象的指针作为另外一个类的数据成员

       

       

    看如下实例:

       

    定义一个坐标类:Coordinate,有数据成员:m_iX 和 m_iY

       

       

       

    再定义一个线段类:Line,如果使用 对象成员 作 数据成员:

       

       

       

       

    如果使用 对象成员指针 作 数据成员,即:*m_pCoorA 和 *m_pCoorB

       

       

       

       

    初始化时,可以使用初始化列表来初始化:

       

       

       

       

    也可以使用普通的初始化:

       

       

       

       

       

    但更多的是这种情况:

       

    因为是两个指针,指针一定要指向某一个对象才能进行操作,才会有意义,

    这里指向的就是两个坐标对象,相当于是在构造函数中从堆中分配了内存,

    同时需要在析构函数中将内存释放掉,保证内存不被泄露

       

       

       

       

     

    对象成员和对象成员指针的不同:

       

    作为对象成员来说,如果使用 sizeof(line) 判断 line 的大小,就应该是

    里面所有对象的大小的总和:16

       

    而对象成员指针则不同,如果使用 sizeof(line) 判断 line 的大小,仅仅

    是两个指针的大小的总和:8

       

       

       

       

       

       

    内存中的对象成员指针:

       

    当实例化 Line 对象时,两个指针就会被定义出来,各占 4 个

    基本内存单元,如果在构造函数中通过 new 运算符从堆中申

    请内存,实例化两个 Coordinate 对象,这两个对象都是在堆

    中,不在 Line 对象中,所以刚才 sizeof(line) 时只能得到 8

       

    当销毁 Line 对象时,也应该先释放掉堆中的内存,再释放掉

    Line 对象本身

       

       

       

       

       

       

       

       

    程序:

       

    Coordinate.h:

       

    class Coordinate

    {

    public:

    Coordinate(int x,int y);

    ~Coordinate();

    int getX();

    int getY();

    private:

    int m_iX;

    int m_iY;

    };

       

       

       

    Coordinate.cpp:

       

    #include "Coordinate.h"

    #include <iostream>

    using namespace std;

       

       

    Coordinate::Coordinate(int x,int y)

    {

    m_iX = x;

    m_iY = y;

    cout << "Coordinate(int x,int y) " << m_iX << "," << m_iY << endl;

    }

       

    Coordinate::~Coordinate()

    {

    cout << "~Coordinate() " << m_iX << "," << m_iY << endl;

    }

       

    int Coordinate::getX()

    {

    return m_iX;

    }

       

    int Coordinate::getY()

    {

    return m_iY;

    }

       

       

       

    Line.h:

       

    #include "Coordinate.h"

       

    class Line

    {

    public:

    Line(int x1, int y1, int x2, int y2);

    ~Line();

    void printInfo();

    private:

    Coordinate *m_pCoorA;

    Coordinate *m_pCoorB;

    };

       

       

       

    Line.cpp:

       

    #include "Line.h"

    #include <iostream>

    using namespace std;

       

       

    Line::Line(int x1, int y1, int x2, int y2)

    {

    m_pCoorA = new Coordinate(x1,y1);//从堆中申请内存来实例化

    m_pCoorB = new Coordinate(x2, y2);

    cout << "Line()" << endl;

    }

       

    Line::~Line()

    {

    delete m_pCoorA;

    m_pCoorA = NULL;//将指针置于安全状态 NULL

    delete m_pCoorB;

    m_pCoorB = NULL;

    cout << "~Line()" << endl;

    }

       

    void Line::printInfo()

    {

    cout << "printInfo()" << endl;

    cout << "(" <<m_pCoorA->getX() << "," <<m_pCoorA->getY() << ")" << endl;

    cout << "(" <<m_pCoorB->getX() << "," << m_pCoorB->getY() << ")" << endl;

    }

       

       

       

    main.cpp:

       

    #include <stdlib.h>

    #include "Line.h"

    #include <iostream>

    using namespace std;

       

    //注意:是在32位编译环境下

    int main(void)

    {

    Line *p = new Line(1, 2, 3, 4);

    p->printInfo();

    delete p;

    p = NULL;

    //指针p的大小是4个字节

    cout << sizeof(p) << endl;

       

    //Line类的对象是8个字节 因为对象包含了2个对象成员指针

    //new出来的是在堆中 所以不归Line类)

    //

    //如果这里的Line类包含的是Coordinate类的对象成员

    //而不是对象成员指针 那么这时 就是16个字节

    //因为Line的对象包含了里面所有数据成员 2个对象成员(分别各有2int

    cout << sizeof(Line) << endl;

     

    system("pause");

    return 0;

    }

       

       

    运行一览:

       

       

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    strcspn()函数
    makfile通用版本
    C实现简单的xml格式文件
    shell编程题(七)
    C语言实现五子棋
    打字软件(最终版本)
    TypeWriting
    KMP 串的模式匹配 (25分)
    C链表操作
    Ubuntu终端字体
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6796297.html
Copyright © 2011-2022 走看看