Wskaźniki do funkcji
Przekazuj funkcje jako argumenty
Wskaźniki do funkcji to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest wskaźnik do funkcji?
Wskaźnik do funkcji przechowuje adres funkcji, dzięki czemu można wywołać ją pośrednio lub przekazywać ją jak dane.
- Typ koduje sygnaturę.
- Pozwala funkcjom przyjmować zachowanie jako parametr.
#include <iostream>
int add(int a, int b) { return a + b; }
int main() {
int (*op)(int, int) = add;
std::cout << op(3, 4) << '\n';
return 0;
}Deklarowanie typu
Deklarację int (*op)(int, int) należy odczytywać tak: op jest wskaźnikiem do funkcji przyjmującej dwie wartości typu int i zwracającej wartość typu int. Nawiasy wokół *op są wymagane.
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}Wywoływanie przez wskaźnik
Wskaźnik do funkcji wywołuje się tak samo jak samą funkcję. Można również jawnie go wyłuskać, ale rzadko jest to potrzebne.
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}Przekazywanie funkcji jako argumentów
Funkcja może przyjmować parametr będący wskaźnikiem do funkcji, dzięki czemu kod wywołujący może dostarczyć własne zachowanie.
#include <iostream>
int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }
int main() {
std::cout << apply(10, doubler) << '\n';
return 0;
}Wybór w czasie działania
Ponieważ wskaźnik do funkcji jest zmienną, można zdecydować, którą funkcję wywołać podczas działania programu.
#include <iostream>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
bool wantAdd = true;
int (*op)(int, int) = wantAdd ? add : sub;
std::cout << op(8, 3) << '\n';
return 0;
}Tablice wskaźników do funkcji
Przechowuj kilka wskaźników do funkcji w tablicy, aby utworzyć prostą tablicę dyspozytorską indeksowaną wartością.
#include <iostream>
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main() {
int (*ops[2])(int, int) = {add, mul};
std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
return 0;
}Używanie typedef
Składnia wskaźników jest mało czytelna. Alias typedef lub using nadaje typowi czytelną nazwę.
#include <iostream>
using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }
int main() {
BinOp op = add;
std::cout << op(6, 7) << '\n';
return 0;
}Wskaźniki do funkcji i algorytmy
Standardowe algorytmy przyjmują obiekty wywoływalne, a zwykła funkcja może pełnić tę rolę. W tym przypadku predykat zlicza liczby parzyste.
#include <iostream>
#include <vector>
#include <algorithm>
bool isEven(int n) { return n % 2 == 0; }
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
int c = std::count_if(v.begin(), v.end(), isEven);
std::cout << "Evens: " << c << '\n';
return 0;
}Ograniczenie: brak stanu
Zwykły wskaźnik do funkcji nie może przechowywać przechwyconych danych. Jeśli trzeba zachować kontekst między wywołaniami, należy użyć zmiennych globalnych lub przejść do bardziej rozbudowanych obiektów wywoływalnych.
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}Konwersja lambd bez przechwytywania
Lambda, która niczego nie przechwytuje, może niejawnie konwertować się do pasującego wskaźnika do funkcji, co jest przydatne w przypadku małych funkcji definiowanych bezpośrednio w kodzie.
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}Puste wskaźniki do funkcji
Wskaźnik do funkcji może mieć wartość nullptr, co oznacza, że nie wskazuje niczego. Przed wywołaniem zawsze należy to sprawdzić, aby uniknąć niezdefiniowanego działania programu.
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat ograniczeń wskaźników do funkcji.
Podsumowanie
Dowiedziałeś się więcej o wskaźnikach do funkcji:
- przechowują adres funkcji i wywołuje się je tak jak funkcję
- pozwalają przekazywać zachowanie jako parametr i tworzyć tablice dyspozytorskie
- aliasy zwiększają czytelność ich typu
- nie mogą przechowywać stanu, ale konwertują się do nich lambdy bez przechwytywania
Następnie poznasz std::function, który może przechowywać dowolny obiekt wywoływalny, także taki ze stanem.
Często zadawane pytania
Czy lekcja „Wskaźniki do funkcji” jest bezpłatna?
Tak — pełny tekst „Wskaźniki do funkcji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wskaźniki do funkcji”?
Przekazuj funkcje jako argumenty Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wskaźniki do funkcji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wskaźniki do funkcji
- std::function
- std::bind
- Wybór obiektów wywoływalnych