Иллюстрированный самоучитель по Visual Studio.Net


Конструкторы и операции


Важными моментами в жизни объектов являются те, когда они копируются или создаются на основе уже существующих. Реализация конструктора копирования объектов просто обязательна, если вы пользуетесь контейнером объектов. В случае отсутствия или некорректного тела конструктора контейнеры откажутся работать с объектами класса. Обычным приемом при этом является реализация в классе операции присвоения operator= () и последующее ее воспроизведение в конструкторе копирования. Обратите внимание на тип возвращаемого значения операции присвоения. Это ссылка (CPolygon&) на активный или стоящий в левой части операции присвоения — *this, объект класса:

CPolygoni CPolygon::operator=(const CPolygonS poly){

//====== Копируем все данные

m_pDoc = poly.m_pDoc;

m_nPenWidth = poly.m_nPenWidth;

m_PenColor = poly.m_PenColor;

m_BrushColor = poly.m_BrushColor;

m_ptLT = poly.m_ptLT;

m_ptRB = poly.m_ptRB;

//===== Освобождаем контейнер точек

if (!m_Points.empty()) m_Points.clear();

//====== Копируем все точки. Возможно решение с помощью assign.

for (OINT i=0; i<poly.m_Points.size();

m_Points.push_back(poly.m_Points[i] )

//====== Возвращаем собственный объект

return *this;

//====== Конструктор копирования пользуется уже

//====== существующей реализацией операции присвоения

CPolygon::CPolygon(const CPolygoni poly)

{

*this = poly;

}

Довольно часто во вновь создаваемых классах переопределяют операцию выбора с помощью угловых скобок ( [ ] ). Смысл этой операции задает программист. Он часто бывает очевидным для классов объектов, содержащих внутри себя контейнеры, как в нашем случае. Так, если к полигону poly применить операцию выбора, например

CDPoint pt = poly[i];

то он возвратит свою i-ю точку, что, безусловно, имеет смысл. Если же операция [ ] возвращает ссылку на i-ю точку, то становится возможным использовать ее и в левой части операции = (присвоения). Например,

poly[i] = CDPoint (2.5, -20.);

Отметим, что в новом языке С#, который поддерживается Studio.Net 7.0, такой прием является встроенным средством языка под названием indexer.


Начало  Назад  Вперед