Нет никакой разницы между двумя функциями-членами.Должно быть так, поскольку это то, что в стандарте C ++ (ISO / IEC 14882: 2003) говорится:
9.3.1 Нестатические функции-члены [class.mfct.nonstatic]
2. Когда id-expression
(5.1) не является частью синтаксиса доступа к элементу класса (5.2.5) и не используется для формирования указателя на член (5.3).1) используется в теле нестатической функции-члена класса X
или используется в mem-initializer
для конструктора класса X
, если поиск по имени (3.4.1) разрешает имя в id-expression
для нестатического нетипичного члена класса X
или базового класса X
, id-expression
преобразуется в выражение доступа к члену класса (5.2.5), используя (*this)
(9.3.2) в качестве постфикса-выражение слева от оператора .
.Затем имя члена относится к члену объекта, для которого вызывается функция.
5.2.5 Доступ к члену класса [expr.ref]
3. Если E1
имеет тип «указатель на класс X
», то выражение E1->E2
преобразуется в эквивалентную форму (*(E1)).E2;
...
, так чтоозначает следующий код:
class C
{
public:
void set_x(int val) { x = val; }
void set_this_x(int val) { this->x = val; }
private:
int x;
};
был бы преобразован в следующий код в соответствии с 9.3.1 / 2 и 5.2.5 / 3:
class C
{
public:
void set_x(int val) { (*this).x = val; } // as per 9.3.1/2
void set_this_x(int val) { (*(this)).x = val; } // as per 5.2.5/3
private:
int x;
};
Чтобы показать, что тамна самом деле нет никакой разницы, по крайней мере, для одного компилятора, вот параллельное сравнение дизассемблирования функции C::set_x()
и C::set_this_x()
, которую компилятор VC ++ генерирует с отключенной оптимизацией (/Od
):
void set_x(int val){ x = val; } void set_this_x(int val){ this->x = val; }
push ebp push ebp
mov ebp,esp mov ebp,esp
sub esp,0CCh sub esp,0CCh
push ebx push ebx
push esi push esi
push edi push edi
push ecx push ecx
lea edi,[ebp-0CCh] lea edi,[ebp-0CCh]
mov ecx,33h mov ecx,33h
mov eax,0CCCCCCCCh mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi] rep stos dword ptr es:[edi]
pop ecx pop ecx
mov dword ptr [ebp-8],ecx mov dword ptr [ebp-8],ecx
mov eax,dword ptr [this] mov eax,dword ptr [this]
mov ecx,dword ptr [val] mov ecx,dword ptr [val]
mov dword ptr [eax],ecx mov dword ptr [eax],ecx
pop edi pop edi
pop esi pop esi
pop ebx pop ebx
mov esp,ebp mov esp,ebp
pop ebp pop ebp
ret 4 ret 4
Обратите внимание, что компилятор создает точно такую же сборку для обеих функций-членов.