pisanie czytelnego kodu
Kod źródłowy
Napis operator+(const Napis&napis) const
Napis napisNowy(m_pch);
napisNowy.Dołącz(napis.m„pch, napis.m_cch);
return napisNowy;
Przy tworzeniu operatora dodawania {+) dzieje się wiele rzeczy. W podanym przykładzie budujemy nową klasę napisów. Dwa napisy są konkatenowane i tworzą nowy napis. Następnie kompilator automatycznie umieszcza egzemplarz napisu w ramce stosu funkcji wywołującej. Będzie on użyty do utworzenia wartości zwrotnej. Konstruktor kopiowania jest wywoływany ze zmienną napisNowy jako parametrem i kopiuje jej zawartość do zmiennej zwrotnej. Przed wyjściem z funkcji zmienna napisNowy zostaje usunięta.
Gdybyśmy połączyli dwa napisy bezpośrednio za pomocą operacji Dołącz, to uzyskalibyśmy większą wydajność. W tym wypadku natomiast operator utworzył dwa egzemplarze tymczasowych zmiennych napisowych i wywołał konstruktor kopiowania.
Oto wygenerowany kod operatora.
00401791 |
lea |
00401794 |
push |
00401795 |
mov |
00401798 |
cali |
0040179D |
mov |
004017A0 |
or |
004017A3 |
mov |
004017A6 |
mov |
0017AA |
lea |
004017AD |
cali |
004017B2 |
mov |
145: } | |
004017B5 |
mov |
eax,dword ptr [napisNowy] eax
ecx,dword ptr [__$R.eturnUdt] ;zmienna napisowa, do której
zostaje zwrócony napis po konkatenacji @ILT+75(??0Napis@@QAE@ABV0@@Z)(OxO04O1O4b) ;konstruktor kopiowania na tej zmiennej z napisNowy jako parametrem
ecx,dword ptr [ebp-1 Ch] ecx,1
dword ptr [ebp~1Ch],ecx
byte ptr [ebp~4],0
ecx,dword ptr [napisNowy]
@ILT+15(MNapis@@QAE@XZ)(Ox0040100f) destruktor napisNowy, gdyż jest to zmienna automatyczna eax,dword ptr [__$ReturnUdt]
ecx,dword ptr [ebp-OCh]