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

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
m Wycofano edycje użytkownika 83.29.164.200 (dyskusja). Autor przywróconej wersji to Lethern.
Lethern (dyskusja | edycje)
poprawki, konwencje
Linia 8:
 
<source lang="cpp">
void funkcja (int);
void funkcja (std::string);
void funkcja (std::string, std::string);
// int funkcja (int); //niedozwolone, funkcje różnią się tylko zwracanym typem
int funkcja (bool); //dozwolone
</source>
 
Linia 20:
 
<source lang="cpp">
void funkcja (int arg1, int arg2 = 0);
void funkcja (int arg1); //to ta sama funkcja, zostanie zgłoszony błąd
</source>
 
Linia 30:
Przeciążenie funkcji stosuje się przy np. potęgowaniu:
<source lang="cpp">
int pot (int, int);
double pot (double, int);
void pot (int&, int);
 
int pot (int podstawa, int wykladnik)
{
int wynik = 1;
for (int i = 0; i < wykladnik; ++i)
wynik = podstawa*wynik;
return wynik;
}
 
double pot(double podstawa, int wykladnik) // przeładowana funkcja I: zwraca inny typ danych i są inne parametry
double pot (double podstawa, int wykladnik)
{
double wynik = 1;
for (int i = 0; i < wykladnik; ++i)
wynik = podstawa*wynik;
return wynik;
}
 
void pot(int& podstawa, int wykladnik) // przeładowana funkcja II: nie zwraca danych tylko modyfikuje podstawę która jest podana przez referencję
void pot (int& podstawa, int wykladnik)
{
int wynik = 1;
for (int i = 0; i < wykladnik; ++i)
wynik = podstawa*wynik;
podstawa = wynik;
}
Linia 94 ⟶ 99:
 
==Typ argumentów==
Czasem możemy chcieć, by funkcja zachowywała się zależnie od tego, jakie argumenty jej dano. Np. piszemy własną bibliotekę do obsługi wyjścia stdout. Chcemy zrobić ładną funkcję, wpisującą sporo typów danych, w tym typ łańcuchów C++. Klasa string jest bardzo skomplikowana i kopiowanie łańcucha w stylu C++ zajęłoby dużo czasu. W takim przypadku dobrze jest użyć stałej referencji na łańcuch:
 
<source lang="cpp">
void pisz (char);
void pisz (std::string);
void pisz (void);
 
void pisz(char a) {
void pisz printf("%c",char a);{
printf ("%c", a);
}
void pisz (std::string a)
{
printf ("%s", a.c_str());
}
void pisz ()
{
printf ("\n");
}
pisz(str); //mamy pewność, że zmienna str nie zostanie zmieniona
</source>
 
{{Uwaga|Zwróćmy uwagę na wywołanie <tt>printf("%s", a'''<big>.c_str()</big>''')</tt>. Należy pamiętać, że pole %s oczekuje łańcucha znaków typu char[],*. nieNie obsłuży zatem typu string, dlatego posługujemy się funkcją c_str() zwracającą napis jako tablicę char.}}
Można by dopisać więcej przykładów, lecz chyba to tłumaczy wszystko dobitnie. Dajemy typ char, wpisuje znak, dajemy łańcuch, wpisuje łańcuch rzutowany na tablicę, puste nawiasy, nowy wiersz...
 
==Szablony funkcji==
{{Main|C++/Szablony funkcji|o1=Szablony funkcji}}
W C++ dostępne są szablony. Wyobraź sobie sytuację: programista pisze funkcję obsługującą sporo typów danych. WtedyMożemy rozwiązać to przez kopiowanie funkcji w kodzie. jednak byłoby to dość uciążliwe. Wówczas możemyMożemy to zrobić krócej:
<source lang="cpp">
template <typename T>
T nazwaFunkcji (argumenty typu T)
{
//do funkcji można przekazać dowolny typ danych
}
</source>