приоритеты перегрженных операций
От: Аноним  
Дата: 06.07.04 15:18
Оценка:
Объясните почему при перегрузке операции постфиксного инкремента ++(и/или =)
получается что вначале выполняется оператор ++ а только потом = в выражении

 p = d++;// -> p = (d++)


снизу показан пример

class aa
{
    int i;
public:
    aa(){ i=0;}
    aa(int _i){ i=_i;}
    aa& operator ++(const int ab)
    {
        i++;
        return *this;
    }
    aa operator =(aa x)
    {
        i = x.i;
        return *this;
    }
};


в итоге имеем что

p.i = 11
d.i = 11
a = 10
b = 11


Вопросы следующие:
1.При перегрузке операций приоритет меняется?(мне кажется не должно)
2 Если приоритет не меняется то почему получаются разные результаты(можно ли это объяснить на уровне синnаксиса — то есть то то выполняется раньше этого потому то потому то — или это разработчики VC так захотели)
3.Как правильно реализовать оператор ++ чтобы он мог работал также как и для типа int и вообще возможно ли это сделать?
4.Что считать выражением? Могут ли в выражение входить вызовы функций и что раньше вызывается вызовы функций или постфиксный инкремент
Пример:
int func(int &a, int b)
{
return a+b;
}

int i = 0;
int x = 0;
x = func(i,i++)+i++;

В данном случае получается что первый постфиксный инкремент ++ идет раньше вызова функции func
42:       x = func(i,i++) + i++;
0040D566   mov         eax,dword ptr [ebp-4]
0040D569   mov         dword ptr [ebp-0Ch],eax
0040D56C   mov         ecx,dword ptr [ebp-0Ch]
0040D56F   push        ecx
0040D570   lea         edx,[ebp-4]
0040D573   push        edx
0040D574   mov         eax,dword ptr [ebp-4]
0040D577   add         eax,1
0040D57A   mov         dword ptr [ebp-4],eax
0040D57D   call        @ILT+65(func) (00401046)
0040D582   add         esp,8
0040D585   add         eax,dword ptr [ebp-4]
0040D588   mov         dword ptr [ebp-8],eax
0040D58B   mov         ecx,dword ptr [ebp-4]
0040D58E   add         ecx,1
0040D591   mov         dword ptr [ebp-4],ecx


В тоге имеем

x = 2
i = 2


Возможно я неправильно понимаю что значит выражение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.