Глава 17. Конструкторы: копирование и присваивание________________421
.44 |
{ |
45 |
return X(); |
46 |
} |
47 |
void Foo( X х) |
48 |
{ |
49 |
X = X; |
50 |
} |
51 |
void main() |
52 |
{ |
53 |
{ |
54 |
X z; // конструктор |
55 |
X у = z; // конструктор копий |
56 |
} // вызов двух деструкторов |
57 |
{ |
58 |
Х z; // конструктор |
59 |
Х y(z); // конструктор копий |
60 |
) // вызов двух деструкторов |
61 |
{ |
62 |
Х z, у; // конструктор |
63 |
у = z; // операция присваивания |
64 |
} // вызов двух деструкторов |
65 |
{ |
66 |
X у = Food; // конструктор |
67 |
} // деструктор |
68 |
{ |
69 |
Х у; // конструктор |
70 |
Foo( у); // конструктор копий |
71 |
} // вызов двух деструкторов |
72 |
} |
Парные скобки {}. использованы для вызова деструкторов в порядке создания объектов. Обычно так не делается, этот прием применен только для того, чтобы вызовы конструкторов и деструкторов для удобства интерпретации результатов следовали парами. Примерный вид результатов воспроизводят комментарии к функции main (); их можно просмотреть в файле Output.dat.
Положение в классах
Местоположение конструктора копий и операции присваивания в классе очень важно. Эти функции-члены обычно осуществляют свою деятельность по дублированию объектов вне класса. А если функции-членц вызываются, явно или неявно, извне класса, и вызываются не экземплярами дочерних классов или друзьями, то эти функции должны располагаться в открытом интерфейсе.
Хотя чаще всего они именно там и находятся, но это не единственная возможность. При некоторых обстоятельствах может потребоваться, чтобы дуб-