Объясните почему при перегрузке операции постфиксного инкремента ++(и/или =)
получается что вначале выполняется оператор ++ а только потом = в выражении
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
Возможно я неправильно понимаю что значит выражение.