Объекты класса как члены данных класса. Примеры

Объекты класса как члены данных класса. Примеры


Содержание


1. Пример объявления и использования объекта класса, который есть членом-данных другого класса

Как известно, в классах могут объявляться члены данных класса, которые являются объектами других классов. В данном примере продемонстрированы использования двух объектов, которые есть членами данных класса.

В примере объявляется 2 класса:

  • класс CMyPoint, определяющий точку с координатами x, y;
  • класс CMyLine, определяющий линию содержащую два объекта типа CMyPoint. Эти объекты содержат координаты концов отрезка, из которых состоит линия.

Класс CMyPoint содержит:

  • внутренние члены данных x, y;
  • конструктор по умолчанию CMyPoint();
  • методы чтения внутренних данных класса GetX(), GetY();
  • метод SetXY(), устанавливающий новые значения x, y.

Класс CMyLine содержит:

  • внутренние члены-данных класса типа CMyPoint с именами mp1, mp2. Эти члены-данных есть объектами класса CMyPoint. Они определяют 2 точки, из которых состоит линия;
  • конструктор по умолчанию CMyLine();
  • методы чтения значения объектов mp1, mp2 которые имеют соответственно имена GetPoint1(), GetPoint2();
  • метод SetLine() для установления нового значения координат концов отрезка CMyLine;
  • метод Length(), вычисляющий длину отрезка.


Объявление и реализация методов классов CMyPoint и CMyLine

// объявление класса CMyPoint
class CMyPoint
{
    int x;
    int y;

    public:
    CMyPoint(void); // конструктор по умолчанию

    // методы класса
    int GetX(void)
    {
        return x;
    }

    int GetY(void)
    {
        return y;
    }

    void SetXY(int nx, int ny)
    {
        x = nx; y = ny;
    }
};

// конструктор по умолчанию
CMyPoint::CMyPoint(void)
{
    x = y = 0;
}

// ----------------------------------------------
// объявление и реализация методов класса CMyLine
class CMyLine
{
    CMyPoint mp1;
    CMyPoint mp2;

    public:
    // конструктор по умолчанию
    CMyLine(void);

    // методы доступа
    CMyPoint GetPoint1(void)
    {
        return mp1;
    }

    CMyPoint GetPoint2(void)
    {
        return mp2;
    }

    void SetLine(CMyPoint p1, CMyPoint p2);

    // метод, который возвращает длину линии
    double Length(void);
};

// реализация методов класса CMyLine
CMyLine::CMyLine(void)
{
    mp1.SetXY(0,0);
    mp2.SetXY(1,1);
}

// установить новые значения точек
void CMyLine::SetLine(CMyPoint p1, CMyPoint p2)
{
    int tx, ty;
    tx = p1.GetX();
    ty = p1.GetY();
    mp1.SetXY(tx, ty);
    tx = p2.GetX();
    ty = p2.GetY();
    mp2.SetXY(tx, ty);
}

// метод, возвращающий длину линии
double CMyLine::Length(void)
{
    int x1, y1, x2, y2;
    double len;

    x1 = mp1.GetX();
    y1 = mp1.GetY();
    x2 = mp2.GetX();
    y2 = mp2.GetY();
    len = System::Math::Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
    return len;
}

Демонстрация использования класса CMyLine

CMyPoint mp1, mp2;
CMyLine ml;
int d;

// вызов методов класса CPoint
// заполнение значений объектов mp1, mp2
mp1.SetXY(5, 8);
d = mp1.GetX(); // d = 5
mp2.SetXY(9, 11);

// вызов методов из CMyLine
ml.SetLine(mp1, mp2); // установить новые значения точек

// вызов метода, возвращающего первую точку из линии
mp1 = ml.GetPoint2();

// проверка
d = mp1.GetX(); // d = 9
d = mp1.GetY(); // d = 11

// вычисления длины отрезка ml
// вызов метода Length
double length;
length = ml.Length(); // length = 5.0

2. Каким образом выполняется вызов конструкторов, если в классе A используется объект класса B? Каким образом выделяется память для объектов этих классов?

Если в классе A объявляется объект класса B, то при объявлении объекта класса A конструкторы обоих классов вызываются в следующей последовательности:

  • конструктор класса B;
  • конструктор класса A.

Такую последовательность действий компилятор формирует автоматически.

Память для членов-данных класса, которые есть объектами класса, выделяется при выделении памяти для объекта класса, в котором эти объекты реализованы. То есть, если описать объект класса A, в котором есть объект класса B, то память для объекта класса A выделяется с учетом (включает в себя) памяти объекта класса B.

Например. Если взять класс CMyPoint, который объявлен в п. 1 этой темы, то при создании объекта класса CMyLine, сначала вызывается соответствующий конструктор класса CMyPoint (выделяется память), а затем вызывается конструктор класса CMyLine.


Связанные темы