C++/Przeciążanie funkcji: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
poprawki, konwencje
Lethern (dyskusja | edycje)
poprawki
Linia 62:
 
== Argumenty domyślne==
 
Pierwszym sposobem przeładowania są argumenty domyślne. Deklaracja funkcji wygląda tak:
 
<source lang="cpp">
int potega (int podstawa, int wykładnik = 2);
</source>
 
W tym przypadku, kiedy funkcje wywołamy poprzez <tt>potega(2)</tt>, będziezostanie dodany parametr domyślny. Będzie to więc znaczyło to samo, co <tt>potega(2, 2)</tt>. Inny przykład:
 
Nie możemy już jednak przeciążyć tej funkcji poniższą:
<source lang="cpp">
void system_liczbowy(int liczba,potega (int baza = 2podstawa) {
{
if (liczba/baza != 0)
system_liczbowy(liczba/baza, baza);
cout << liczba % baza;
}
</source>
 
Program wypisuje liczbę w innym systemie liczbowym, domyślnie dwójkowym.
 
==Liczba argumentów==
Znowu się weźmiemy za nieszczęsne potęgi.
 
<source lang="cpp">
int potega(int podstawa) {
return podstawa*podstawa;
}
 
int potega(int podstawa, int wykladnik) {
int wynik = 1;
for (int i = 0, i < wykladnik, ++i) wynik *= podstawa;
return wynik;
}
</source>
 
W tym przypadku, gdy podamy jeden argument, kompilator nie będzie mógł określić o którą funkcję nam chodzi - dwuargumentową z jednym argumentem domyślnym, czy zwykłą jednoargumentową.
W tym przypadku, gdy podamy jeden argument, wywoła się pierwsza funkcja, a gdy dwa, druga. Wielkim błędem byłoby użycie deklaracji drugiej funkcji, dodając wartość domyślną do argumentu <tt>wykladnik</tt>, program wtedy nie wiedział by, czy użyć funkcji pierwszej, jednoargumentowej, czy drugiej, dwuargumentowej, odwołując się do wartości domyślnej.
 
==Typ argumentów==
Czasem możemy chcieć, by funkcja zachowywała się zależnie od tego, jakie argumenty jej dano. Np.Załóżmy, że piszemy własną bibliotekę do obsługi standardowego wyjścia stdout. Chcemy zrobić ładną funkcję, wpisującąwypisującą spororóżne typówtypy danych, w tym typ łańcuchów C++.
 
<source lang="cpp">