Я бы хотел уточнить некоторые моменты, связанные с вызовом конструктора копии и обычного конструктора. У меня есть класс, содержащий указатель на динамически выделяемую память. Я включил в конструктор и деструктор соответствующие блоки. Также перегрузил оператор присваивания и явно написал конструктор копии чтобы избежать побитового копирования по умолчанию. Ввел необходимые арифметические операции как члены класса:
classname classname::operator+(const classname &right) {
classname temp(param);
...
return temp;
}
classname classname::operator*(const classname &);//реализация аналогично +
Насколько я понимаю при обращении объекту класса первый раз вызывается конструктор, а при выходе из области его видимости — деструктор. Просто протестировал следующую строчку:
classname A(param), B(param), C(param);
A=B*C+A;
И посмотрел в каком порядке вызываются кон/деструкторы. Оказалось что деструкторы вызываются не сразу после выхода из функции перегруженного оператора и использовании программой возвращаемого им значения а только после обработки знака равенства. Вот в этот момент и вызываются все необходимые деструкторы для удаления промежуточных результатов вычислений.
На эту в общем-то логичную штуку наткнулся после попытки выяснить когда же все-таки вызывается конструктор копии объекта. Два варианта понятны, а именно: когда производится инициализация свежеобъявленного объекта класса другим объектом (classname A=B), и когда имеет место передача объекта в функцию по значению. Но ещё он может вызываться при возвращении копии локального объекта, объявленного в какой-нибудь функции. Идея понятна: локальный умирает при выходе из функции а копия возвращается. Правда бывает так не всегда. В частности в моей функции умножения он вызывается, а в функции сложения нет (деструктор вызывается при обработке знака равенства). Хотелось бы уточнить когда же все-таки он вызывается и от чего это зависит... Это был вопрос. :)
И второй вопрос по поводу перегрузки операторов.
Можно ли каким-нибудь хитрым ходом сделать перегрузку псевдооператора [][] (двойной массив), которого нет, через [], который есть. Вариант [x,y] понятен но хотелось бы чтобы сохранился вид [x][y]. Это тоже был вопрос к многоуважаемому сообществу программистов. :)