Twoje Centrum Szkoleniowe

Nauczmy się dziś czegoś nowego!

Kurs programowania - C++

C++: Parametry wejściowe i argumenty funkcji

Różnica między parametrami a argumentami

Parametry funkcji są to zmienne określone w definicji funkcji, działające jako zastępcy dla wartości, które funkcja otrzyma podczas jej wywołania. Są one rodzajem "zmiennych szablonowych", które definiują typ danych i służą jako miejsce trzymania danych przekazywanych funkcji.

void przykladowaFunkcja(int parametr) {
    // kod funkcji
}

Oznacza to tyle, że wartość przekazana do funkcji, w tym wypadku typu int, otrzymuje wewnątrz funkcji swoją nazwę i pod tą nazwą jest tu dostępna. Jest to tym samym deklaracja zmiennej lokalnej dostępnej wewnątrz funkcji.

 

Argumenty funkcji to konkretne wartości przekazywane do funkcji w momencie jej wywołania. Argumenty są rzeczywistymi wartościami przypisanymi do parametrów funkcji, kiedy jest ona wywoływana.

przykladowaFunkcja(5); // 5 jest argumentem

 

W praktyce, parametr funkcji to zmienna zdefiniowana wewnątrz nawiasów funkcji, podczas gdy argument to wartość przekazywana do tej funkcji podczas jej wywołania.

 

Typy parametrów: Wartościowe, referencyjne, wskaźnikowe

A teraz fragment bardziej zaawansowany, ale warto wiedzieć, że parametry do funkcji przekazywać możemy nie tylko za pomocą wartości. Ale po kolei.

 

Parametry wartościowe (przekazywanie przez wartość):

Gdy funkcja przyjmuje parametry wartościowe, otrzymuje kopie rzeczywistych argumentów przekazywanych do funkcji. Mówiliśmy o nich na początku tej lekcji.

 

void funkcjaWartosciowa(int liczba) {
    liczba += 5; // zmiana nie wpłynie na zmienną poza funkcją
}

 

Parametry referencyjne (przekazywanie przez referencję):

Przekazanie parametrów przez referencję oznacza, że funkcja otrzymuje odniesienie do (adres) argumentu, a nie jego kopię. Pozwala to na bezpośrednią modyfikację przekazywanych danych bez konieczności ich kopiowania.

 

void funkcjaReferencyjna(int &liczba) {
    liczba += 5; // zmiana wpłynie na zmienną poza funkcją
}

Ten mały, widoczny na przykładzie znaczek, a mianowicie &, wiele zmienia. Tym razem nie pracujemy na lokalnej kopii zmiennej, a dostajemy odniesienie do zmiennej spoza funkcji. To oznacza, że pracujemy bezpośrednio na niej, a każda zmiana dokonana w ten sposób, zmieni wartość zmiennej, której referencję dostaliśmy, np. zmienną zadeklarowaną bezpośrednio w funkcji main().

 

Parametry wskaźnikowe (przekazywanie przez wskaźnik):

Parametry wskaźnikowe oznaczają, że funkcja przyjmuje adres zmiennej zamiast samej wartości. Są używane do manipulowania danymi na poziomie adresów pamięci i są przydatne w operacjach na tablicach i dynamicznej alokacji pamięci.

 

void funkcjaWskaznikowa(int *liczba) {
    *liczba += 5; // zmiana wpłynie na zmienną poza funkcją
}

Różnica w stosunku do referencji jest taka, że tam, pracujemy bezpośrednio na przekazanej zmiennej, tu natomiast mamy wskaźnik, adres tej zmiennej i wykonujemy działania z jego wykorzystaniem.

Dokładniejsze omówienie tej kwestii w jednym z kolejnych tematów, natomiast na dziś chciałbym, żeby jasnym było, że mamy więcej sposobów, niż tylko przekazanie parametru do funkcji przez wartość. Można również wykorzystać referencje czy wskaźniki.

 

Domyślne wartości parametrów

Domyślne wartości parametrów w funkcjach C++ umożliwiają określenie wartości, które zostaną użyte, gdy nie podano żadnych argumentów dla danego parametru przy wywołaniu funkcji.

 

Załóżmy, że stworzyliśmy sobie funkcję, która ma zadaną ilość razy wypisać na ekran: "Będę uważał na lekcji!".

void napisz(int ile_razy) {
    for (int i = 0; i < ile_razy; i++) {
        std::cout << "Będę uważał na lekcji!" << std::endl;
    }
}

 

Gdy wywołamy ją w następujący sposób:

napisz(5);

Tekst wypisze się 5 razy na ekranie.

 

Jeśli natomiast wywołamy ją tak:

napisz();

Otrzymamy błąd: za mało argumentów funkcji - gdyż nie podaliśmy wartości ile_razy.

 

Dla każdego parametru wejściowego funkcji możemy ustawić wartość domyślną. Jeśli nie podamy wartości danego parametru, zostanie wykorzystana wartość domyślna. Dokonajmy zatem zmian w kodzie:

void napisz(int ile_razy=10) {
    for (int i = 0; i < ile_razy; i++) {
        std::cout << "Będę uważał na lekcji!" << std::endl;
    }
}

Ustawiliśmy, za pomocą operatora przypisania, wartość domyślną zmiennej ile_razy na 10.

 

Tym razem, wywołanie:

napisz();

Spowoduje wypisanie 10 razy na ekran: "Będę uważał na lekcji!"

 

Kiedy używać domyślnej wartości

Domyślne wartości są szczególnie przydatne w sytuacjach, gdy większość wywołań funkcji powinna używać standardowej wartości dla jednego lub więcej parametrów.

 

Co jest ważne w ustalaniu domyślnej wartości

Domyślne wartości należy określać od prawej strony listy parametrów do lewej. Oznacza to, że nie można zdefiniować domyślnej wartości dla parametru, jeśli po jego lewej stronie znajduje się parametr bez domyślnej wartości.

 

Przykład:

int dodaj(int a, int b=10, int c) {
    return a + b + c;
}

Taki zapis funkcji dodaj wygeneruje błąd: brak domyślnego argumentu dla parametru 3.

 

Poprawny zapis:

int dodaj(int a, int b, int c=10) {
    return a + b + c;
}

Przypisane wartości domyślne dla parametrów, od prawej strony.

 

Funkcję wywołać możemy z dwoma lub trzema argumentami:

dodaj(30,50);
dodaj(100,200,300);

 

Testy przypięte do lekcji
Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się
Aby widzieć ocenę lekcji - Zaloguj się