Объекты класса как члены данных класса. Примеры
Содержание
- 1. Пример объявления и использования объекта класса, который есть членом-данных другого класса
- 2. Каким образом выполняется вызов конструкторов, если в классе A используется объект класса B? Каким образом выделяется память для объектов этих классов?
- Связанные темы
Поиск на других ресурсах:
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.
Связанные темы
- Ссылки на объект класса. Доступ к объекту класса по ссылке. Ссылки как члены данных класса. Примеры
- Использование членов-данных класса. Статические (static) члены данных в классе. Статические члены данных для native-классов и managed-классов в среде CLR
- Понятие класса. Объявление класса. Объект класса. Классы в среде CLR. Инкапсуляция данных в классе
- Конструктор класса. Конструктор по умолчанию. Параметризированные конструкторы. Примеры классов, содержащих конструкторы