Глава 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.

Положение в классах

Местоположение конструктора копий и операции присваивания в классе очень важно. Эти функции-члены обычно осуществляют свою деятельность по дублированию объектов вне класса. А если функции-членц вызываются, явно или неявно, извне класса, и вызываются не экземплярами дочерних классов или друзьями, то эти функции должны располагаться в открытом интерфейсе.

Хотя чаще всего они именно там и находятся, но это не единственная возможность. При некоторых обстоятельствах может потребоваться, чтобы дуб-