Re: Перегрузка оператора и конструктор копии
От: comer США http://getboost.codeplex.com/
Дата: 25.12.02 18:27
Оценка: 1 (1)
Здравствуйте, 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];

}
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.