Здравствуйте, Jamais Vu, Вы писали:
1. Для начала покрасим твой текст:
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;
JV>И посмотрел в каком порядке вызываются кон/деструкторы. Оказалось что деструкторы вызываются не сразу после выхода из функции перегруженного оператора и использовании программой возвращаемого им значения а только после обработки знака равенства.
Правильно, деструкотр присваиваемого объекта
обязан вызывать
после операции, в данном случае присваивания.
Если было бы не так, тогда что бы мы присваивали бы после работы деструктора

?
JV>Вот в этот момент и вызываются все необходимые деструкторы для удаления промежуточных результатов вычислений.
JV>На эту в общем-то логичную штуку наткнулся после попытки выяснить когда же все-таки вызывается конструктор копии объекта.
Компилятор может оптимизировать и считать твой объект classname temp(param) в оператора * или + тем временным объектом в который расчитываеться результат операции * или +.
JV>Можно ли каким-нибудь хитрым ходом сделать перегрузку псевдооператора [][] (двойной массив), которого нет, через [], который есть. Вариант [x,y] понятен но хотелось бы чтобы сохранился вид [x][y]. Это тоже был вопрос к многоуважаемому сообществу программистов. 
Можно сделать промежуточный класс который будет возвращать оператор[] твоего класса, и который сам будет иметь оператор[].
Например:
class YourClass
{
int a[5][5];
class Tmp
{
YourClass &your_class;
int i;
Tmp(YourClass &your_class_, int i_): your_class(your_class_), i(i_)
{
}
Tmp(const Tmp &);
friend class YourClass;
public:
int &operator[](int j)
{
return your_class.a[i][j];
}
};
public:
Tmp operator[](int i)
{
return Tmp(*this, i);
}
};
int main()
{
YourClass y;
y[3][4]=5;
int m=y[3][4];
}