Menu Zamknij

Kurs C++

Opis kursu

  • Płacisz za jeden miesiąc nauki.
  • Uczysz się tak długo, jak potrzebujesz.
  • Pełne wsparcie na każdym etapie nauki.
  • Pytasz o wszystko, tyle razy, ile potrzebujesz i wtedy, kiedy chcesz. Szybko otrzymasz odpowiedź.
  • Spotkania 1:1 online + nagranie ze spotkania.
  • Plan nauki dopasowany do Ciebie.
  • Dużo zadań i projektów praktycznych.
  • Stały feedback na Twój kod i strukturę projektów.
  • Uczysz się w swoim tempie.
  • Motywuję Cię do pracy i dbam o Twoje postępy.
  • Portfolio w kilka miesięcy.
  • Szukasz pracy w trakcie kursu.
  • Otrzymasz certyfikat ukończenia kursu.
promocja ikona
PROMOCJA – pierwsze spotkanie GRATIS

Już teraz

zapisz się na kurs​

Zostaw swoje namiary, a skontaktuję się z Tobą w sprawie kursu

    * - pola obowiązkowe

    Administratorem danych osobowych jest KM PROGRAMS KRZYSZTOF MAKOWSKI z siedzibą przy ul. Cicha 7, 42-454 Niegowonice, Polska. Dane osobowe osób korzystających z formularza kontaktowego przetwarzane są w celu identyfikacji nadawcy oraz obsługi zapytania przesłanego przez udostępniony formularz. Więcej informacji o przetwarzaniu danych osobowych, w tym o przysługujących Ci uprawnieniach, znajduje się w Polityce Prywatności.

    Plan kursu

    Kurs przeznaczony jest dla osób początkujących oraz dla zaawansowanych programistów, którzy chcą zagłębić się w detale C++, wyciągnąć maksimum z możliwości tego języka oraz podnieść swoje kompetencje do najnowszego standardu języka C++. Skupiamy się na tym, co w C++ najważniejsze: wydajność i efektywne zarządzanie pamięcią. Zaczynamy od podstaw, następnie przechodzimy do zaawansowanych technik i nowoczesnych standardów języka C++. Połączymy teorię z dużą ilością praktyki – każde zagadnienie poparte jest przykładami kodu, ćwiczeniami i realnymi zastosowaniami C++ w różnych kontekstach programistycznych.

    • Poznasz wszystkie kluczowe mechanizmy języka C++.
    • Nauczysz się pisać nowoczesny, szybki i efektywny kod.
    • Poznasz zarówno C++11 – wciąż powszechnie wykorzystywany w wielu firmach – jak i najnowsze rozwiązania dostępne w C++23 i nowszych standardach. 
    • Uwzględniamy również klasyczne elementy języka, takie jak np. raw pointers, co przygotuje Cię do pracy z kodem, niezależnie od jego wieku czy stylu.
    • Będziesz gotowy do pracy jako programista C++ – nie tylko z teorią, ale i praktyką

    Kurs jest obecnie aktualizowany do najnowszej wersji. Regularnie dodaję nowe materiały. W najnowszej wersji mam już ponad 100 godzin materiałów! Dołącz do nauki i poznaj prawdziwą moc języka C++ – profesjonalnie, konkretnie, praktycznie i z pasją!

    W tej sekcji zainstalujemy kompilator języka C++ oraz IDE, w którym będziesz pisał kod w C++. Używamy najlepszych narzędzi na rynku. Jeśli lubisz pracować z IDE od JetBrains dostaniesz ode mnie licencję.

    • Instalacja narzędzi potrzebnych do uruchamiania aplikacji napisanej w C++
    • Pierwszy program w C++
    • Przegląd i wybór najlepszego IDE do tworzenia aplikacji w C++
    • Analiza struktury pierwszego programu w C++

    Środowisko programistyczne zainstalowane i uruchomione. Najwyższy czas na dobre wejść do świata C++. W tej sekcji poznasz podstawy języka C++. Już na tym etapie poznasz unikalne możliwości języka C++ i szybko poczujesz różnicę, którą daje ten język pod kątem zarządzania wydajnością aplikacji.

    • Zmienne i typy danych
    • Deklaracja i definicja
    • Zasięg zmiennych
    • Konwencje nazewnicze
    • Strumienie wyjścia i wejścia
    • Przestrzeń nazw std
    • Zakresy wartości zmiennych typów liczbowych
    • Liczby zmiennoprzecinkowe
    • Operatory i warunki logiczne
    • Typy o precyzyjnie zadanej szerokości
    • Instrukcje warunkowe
    • Pętle
    • Funkcje matematyczne
    • Generowanie wartości pseudolosowych
    • Pobieranie danych od użytkownika
    • Tworzenie własnych przestrzeni nazw
    • Tworzenie aliasów (typedef, using)
    • Stałe (const, constexpr)
    • Typy wyliczeniowe (enum, enum class)
    • Słowo kluczowe auto
    • Słowo kluczowe volatile
    • Określenie typu wyrażenia za pomocą decltype
    • Wyrównanie zmiennych w pamięci za pomocą alignas oraz alignof
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Funkcje to ważny element aplikacji w każdym języku programowania. W tej sekcji dowiesz się, jakie możliwości pod kątem tworzenia funkcji daje Ci język C++.

    • Definiowanie nagłówka i ciała funkcji
    • Wywołanie funkcji
    • Określanie parametrów funkcji
    • Przekazywanie argumentów podczas wywołania funkcji
    • Walidacja argumentów funkcji
    • Określanie typu zwracanego funkcji
    • Function overloading
    • Argumenty domyślne
    • Funkcje inline
    • Rzucanie wyjątków w ciele funkcji
    • Funkcje constexpr
    • Rekurencja
    • Funkcje constexpr z rekurencją
    • Podział kodu na pliki
    • Implementowanie funkcji realizujących popularne algorytmy
    • Rozwiązujemy zadania teoretyczne i praktyczne

    W tej sekcji  wprowadzamy raw pointers. Dzięki temu poznasz zasadę działania wskaźników i wykorzystasz je w różnych przypadkach użycia. Od tego momentu zaczynamy drogę, która doprowadzi nas do inteligentnych wskaźników. Nie zapominamy jednak o surowych wskaźnikach, co pozwoli przygotować Cię do pracy z kodem w różnych standardach języka C++. 

    • Adres zmiennej
    • Różne sposoby definiowania wskaźnika
    • Operator dereferencji
    • Słowo kluczowe auto w definiowaniu wskaźnika
    • Operator reinterpret_cast
    • Wskaźnik void*
    • Ustawianie wskaźnika na nullptr
    • Operacje na wskaźnikach
    • Wskaźnik jako parametr funkcji (przekazywanie przez kopię, przekazywanie przez adres)
    • Wskaźnik do stałej, stały wskaźnik, stały wskaźnik do stałej
    • Dynamiczna alokacja pamięci
    • Wskaźnik do wskaźnika
    • Pokazujemy praktyczne przykłady używania wskaźników
    • Rozwiązujemy zadania teoretyczne i praktyczne

    W tej sekcji wprowadzamy pierwszy kontener danych – tablicę. Uczymy się zarządzać tablicami statycznymi i dynamicznymi. Tworzymy tablice jednowymiarowe oraz wielowymiarowe. Wprowadzamy pierwsze elementy biblioteki STL, które pomogą nam w pracy z tablicami.

    • Tablice jednowymiarowe statyczne
    • Tablice jednowymiarowe dynamiczne
    • Tablice wielowymiarowe statyczne
    • Tablice wielowymiarowe dynamiczne
    • Implementacja funkcji do zarządzania tablicami jednowymiarowymi
    • Implementacja funkcji do zarządzania tablicami wielowymiarowymi
    • Implementacja popularnych algorytmów wykorzystujących tablice
    • Prezentacja wbudowanych kontenerów o charakterze podobnym do tablic (std::array, std::vector)
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Znajomość struktury pamięci aplikacji to sposób na jeszcze lepsze zrozumienie mechanizmów, które pozwolą zarządzać wydajnością programu. Dlatego ta sekcja pozwoli poznać teorię struktury pamięci programów pisanych w języku C++.

    • Segment kodu
    • Segment danych
    • Stos, sterta
    • Segment stałych
    • Rejestry
    • Pamięć statyczna i dynamiczna
    • Analiza kodu
    • Rozwiązujemy zadania teoretyczne

    Wskaźniki w C++ to temat, o którym można mówić bez końca. W tej sekcji poznasz kolejne właściwości wskaźników. Połączymy ich możliwości z funkcjami. To również moment w naszej wspólnej nauce, kiedy wprowadzamy referencje.

    • Tworzenie stałych obiektów za pomocą new
    • Przygotowanie własnej funkcji do wykonania akcji w razie błędu bad_alloc
    • Umiejscowienie obiektów w zarezerwowanej wcześniej pamięci
    • Wskaźniki do funkcji
    • Implementacja funkcji wyższego rzędu z wykorzystaniem wskaźników do funkcji
    • Rozpoznawania typu wskaźnika do funkcji za pomocą decltype oraz auto
    • Tworzenie aliasów dla wskaźników do funkcji (using)
    • Uzupełnienie wiadomości na temat operatorów rzutowania (static_cast, const_cast, reinterpret_cast, dynamic_cast)
    • Lvalue oraz rvalue
    • Referencje lvalue
    • Parametr funkcji jako referencja do lvalue
    • Referencja do rvalue
    • Parametr funkcji jako referencja do rvalue
    • Funkcja zwracająca referencję
    • Referencje a słowo kluczowe auto
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Ciągi znaków, czyli napisy, to najpopularniejsza forma przechowywania danych nie tylko w C++. Najwyższa pora poznać możliwości napisów i zastosować je w dużej liczbie praktycznych przykładów. Dodatkowo wprowadzamy wyrażenia regularne, które pozwolą nam na jeszcze więcej w temacie zarządzania postacią danych przechowywanych w formie ciągów znaków.

    • Znak i napis
    • C-strings
    • Wprowadzenie do klasy std::string
    • Sposoby tworzenia napisów std::string
    • Raw strings
    • Właściwości napisów
    • Operatory i funkcje do zarządzania napisami
    • Wprowadzenie do iteratorów i wykorzystanie ich w funkcjach do zarządzania napisami
    • Wprowadzenie do mechanizmu przenoszenia i wykorzystanie go w pracy z napisami
    • Przetwarzanie znaków w napisie
    • Znaki unicode w napisie
    • Typy wchar_t, std::wstring, char8_t, char16_t, char32_t, std::u8string, std::u16string, std::u32string
    • Teoria wyrażeń regularnych
    • Praktyczne przykłady prezentujące typy wykorzystujące wyrażenia regularne
    • Implementacja popularnych algorytmów wykorzystujących napisy
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Algorytmy pozwalają optymalnie rozwiązać różne problemy programistyczne. W tej sekcji poznasz wiele algorytmów, nauczysz się zasady ich działania i implementacji. To znakomita dawka wiedzy, która pozwoli Ci zrozumieć istotę działania wielu elementów ze świata programowania i wykorzystać je w swoich aplikacjach.

    • Algorytmy badające właściwości geometryczne
    • Algorytm badające właściwości matematyczne
    • Konwersje pomiędzy systemami liczbowymi
    • Badanie ciągów danych pod kątem wybranych właściwości
    • Sortowanie ciągów danych
    • Zastosowanie metody dziel i zwyciężaj
    • Wybrane metody numeryczne
    • Programowanie zachłanne
    • Algorytmy na tekstach
    • Wybrane algorytmy kryptograficzne
    • Rekurencja
    • Przegląd wybranych struktur danych
    • Rozwiązujemy zadania teoretyczne i praktyczne

    W tej sekcji dowiesz się, jak pobierać dane z plików tekstowych oraz jak zapisywać dane do plików tekstowych. To świetny moment, żeby do naszych programów na stałe wprowadzić jeden z najpopularniejszych kontenerów w C++ czyli std::vector.

    • Omówienie zasady działania kontenera std::vector
    • Sposoby tworzenia std::vector
    • Operatory i funkcje do zarządzania std::vector
    • Wykorzystanie iteratorów do pracy z std::vector
    • Zapisywanie danych do plików tekstowych
    • Odczytywanie danych z plików tekstowych
    • Parsowanie danych odczytanych z pliku tekstowego
    • Rozwiązujemy zadania teoretyczne i praktyczne

    C++ posiada niesamowite możliwości pod kątem tworzenia aplikacji opartych o mechanizmy programowania obiektowego. Nie mogłem więc przepuścić tej okazji i w tej sekcji bardzo szczegółowo w oparciu o dużą liczbę praktycznych przykładów przeprowadzam Cię przez niesamowity świat obiektowości w C++. Zostaniemy w nim do końca naszej wspólnej nauki.

    • Definiowanie klasy i obiektu
    • Struktury
    • Różnica pomiędzy klasą a strukturą
    • Omówienie założeń enkapsulacji
    • Pola składowe klasy
    • Proste funkcje składowe klasy
    • Funkcje składowe typu const, volatile oraz constexpr
    • Funkcje składowe ze specyfikatorami default oraz delete
    • Słowo kluczowe this
    • Modyfikatory dostępu
    • Klasa a dynamiczny przydział pamięci
    • Konstruktory
    • Słowo kluczowe explicit
    • Lista inicjalizacyjna a lista std::initializer_list
    • Konstruktory constexpr
    • Wyjaśnienie pojęć glwartość, xwartość oraz prwartość
    • Konstruktory kopiujące i przenoszące
    • Destruktory
    • Składniki statyczne w klasie
    • Słowo kluczowe mutable
    • Klasa a podział na pliki
    • Operatory konwersji
    • Deklaracja przyjaźni
    • Przeładowanie operatorów
    • Kompozycja
    • Klasy zagnieżdżone
    • Tablice obiektów
    • Zastosowanie wskaźników do pracy z klasami
    • Klasa do zarządzania jednowymiarową tablicą dynamiczną
    • Klasa do zarządzania wielowymiarową tablicą dynamiczną
    • Klasa do zarządzania kontenerem std::vector
    • Klasa realizująca strukturę listy jednokierunkowej
    • Klasa realizująca strukturę listy dwukierunkowej
    • Unie i pola bitowe
    • Typ variant
    • POD
    • Type traits
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Nareszcie! Na stałe wprowadzamy smart pointers. Od tej pory unikamy raw pointers, które już doskonale znasz. Najwyższa pora wejść na wyższy poziom zarządzania dynamiczną alokacją pamięci dla obiektów w C++ i … przestać się nią zajmować ręcznie, zlecając to inteligentnym wskaźnikom.

    • Semantyka przenoszenia
    • Porównanie raw pointers oraz smart pointers
    • std::unique_ptr
    • std::shared_ptr oraz std::weak_ptr
    • Implementacja relacji many-to-one oraz one-to-many za pomocą wskaźników inteligentnych
    • Implementacja relacji one-to-one oraz many-to-one za pomocą wskaźników inteligentnych
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Kolejna mocna sekcja na naszej drodze do profesjonalnego pisania kodu w C++. Teraz zajmiemy się dziedziczeniem oraz asocjacjami. W praktycznych przykładach będziemy mieszać te pojęcia z inteligentnymi wskaźnikami. Struktura naszych aplikacji stanie się jeszcze bardziej złożona, a zarazem jeszcze bardziej uporządkowana.

    • Omówienie zasad dziedziczenia
    • Klasa podstawowa i klasa pochodna
    • Dostęp do składników klasy podstawowej
    • Konstruktory w dziedziczeniu
    • Kolejność wywołania konstruktorów w dziedziczeniu
    • Wirtualne funkcje składowe
    • Polimorfizm
    • Wczesne i późne wiązanie
    • Destruktory w dziedziczeniu
    • Słowa kluczowe final oraz override
    • Klasy final
    • Klasy abstrakcyjne
    • Dynamiczna identyfikacja typu
    • Rzutowanie dynamic_cast a polimorfizm
    • Wielodziedziczenie
    • Asocjacje (agregacja, kompozycja)
    • Rozwiązujemy zadania teoretyczne i praktyczne

    Kiedy już znasz programowanie obiektowe i szereg zagadnień, które są z nim związane, omawiamy zasady i dobre praktyki OOP. To one pozwolą Ci uniknąć typowych błędów w strukturze Twojego kodu i dadzą Ci elastyczność, dzięki której wygodnie rozbudujesz swoje aplikacje o kolejne funkcjonalności.

    • SOLID
    • Inne dobre praktyki programowania obiektowego i nie tylko
    • Rozwiązujemy zadania teoretyczne i praktyczne

    W tej sekcji rozpoczniesz pracę z narzędziem CMake, które pozwoli Ci tworzyć projekty o czytelnej i uporządkowanej strukturze. Dzięki niemu zyskasz pełną kontrolę nad konfiguracją oraz łatwe zarządzanie zewnętrznymi zależnościami, co ułatwi rozwój i utrzymanie aplikacji.

    • Zasada działania CMake
    • Plik CMakeLists.txt
    • Omówienie zawartości pliku CMakeLists.txt
    • Konfiguracja ustawień projektu (wersja CMake, nazwa, wersja kompilatora C++ i inne)
    • Przygotowanie konfiguracji do analizy plików projektu
    • Przygotowanie konfiguracji do pobierania danych z plików zewnętrznych
    • Dodawanie zewnętrznych dependencies
    • Kompilacja i budowanie projektu

    W tym dziale poznasz mechanizmy obsługi wyjątków w C++. Nauczysz się bezpiecznie reagować na błędy przy użyciu bloków try, catch i throw. Dowiesz się też, jak działa noexcept i jak wykorzystać wyjątki, by kod był bardziej niezawodny.

    • Sposoby przechwytywania i obsługi sytuacji wyjątkowych
    • Zagnieżdżanie bloków try
    • Specyfikator noexcept oraz operator noexcept
    • Wyjątki std::uncaugth_exceptions

    W tym dziale zobaczysz prawdziwą moc C++. Szablony pozwalają pisać kod uniwersalny i superszybki — bez kompromisów. Poznasz zarówno podstawy, jak i zaawansowane wzorce, które stoją za bibliotekami STL i Boost.

    • Wprowadzenie do szablonów
    • Szablony funkcji i klas
    • Specjalizacje i dopasowanie szablonów
    • SFINAE
    • Szablony wariadyczne
    • Szablony zmiennych
    • decltype i auto w kontekście szablonów
    • Szablony szablonów
    • Wzorzec CRTP
    • Funktory
    • Policy-based design
    • Funktory wbudowane i definiowane przez programistę
    • Wyrażenia lambda i jego różne postaci
    • Lista argumentów
    • Ciało wyrażenia lambda
    • Lista wychwytywania
    • Słowo kluczowe mutable w wyrażeniu lambda
    • Wyjątki w wyrażeniach lambda
    • Wyrażenie lambda zastosowane w funkcji składowej
    • Szablon std::function
    • Wyrażenie lambda jako domniemana wartość argumentu
    • Zagadnienia uzupełniające
    • Klasyfikacja wzorców projektowych
    • Implementacja wzorców kreacyjnych
    • Implementacja wzorców strukturalnych
    • Implementacja wzorców czynnościowych
    • Zagadnienia uzupełniające
    • Wzorzec projektowy iterator
    • Wprowadzenie do kontenerów
    • Klasyfikacja kontenerów
    • Kontenery sekwencyjne (std::vector, std::list, std::deque)
    • Kontenery asocjacyjne (std::set, std::multiset, std::map, std::multimap)
    • Kontenery asocjacyjne z haszowaniem (std::unordered_set, std::unordered_map)
    • Adaptery kontenerów (std::stack, std::queue, std::priority_queue)
    • Typy krotkowe std::tuple
    • Typ std::pair
    • Omówienie algorytmów STL
    • Wskaźniki inteligentne
    • Zastosowanie wskaźników inteligentnych do pracy z kontenerami
    • Zagadnienia uzupełniające
    • Omówienie formatu JSON
    • Przegląd bibliotek do pracy z formatem JSON
    • Konfiguracja aplikacji do pracy z formatem JSON
    • Proste przykłady konwersji danych
    • Wykorzystanie formatu JSON do pracy z komponentami biblioteki STL
    • Zastosowanie formatu JSON w aplikacjach komercyjnych
    • Zagadnienia uzupełniające
    • Wprowadzenie do relacyjnych baz danych
    • Język SQL
    • Omówienie architektury aplikacji bazodanowej
    • Przegląd bibliotek do pracy z relacyjnymi bazami danych
    • Konfiguracja aplikacji do pracy z relacyjnymi bazami danych
    • Implementacja relacji bazodanowych
    • Zarządzanie danymi relacyjnej bazy danych
    • Implementacja kompletnej aplikacji bazodanowej
    • Zagadnienia uzupełniające
    • Omówienie założeń wielowątkowości
    • Różne sposoby tworzenia wątków
    • Dołączanie i odłączanie wątków
    • Przekazywanie argumentów do wątków
    • Omówienie zagadnienia wyścigów
    • Sposoby współdzielenia danych pomiędzy wątkami
    • Rozwiązanie problemu wyścigów z wykorzystaniem std::mutex
    • Wykorzystanie szablonu std::lock_guard
    • Wprowadzenie do zagadnienia przechwytywania zdarzeń w aplikacjach wielowątkowych
    • Zastosowanie condition variables do przechwytywania zdarzeń
    • Przykłady zastosowań typów std::future oraz std::promise
    • Programowanie asynchroniczne z wykorzystaniem std::async()
    • Przykład zastosowania szablonu std::packaged_task
    • Zagadnienia uzupełniające

    Git to jedno z najważniejszych narzędzi w pracy programisty – pozwala zarządzać kodem, kontrolować zmiany i bezpiecznie rozwijać projekt w zespole. W tym module poznasz również GitHub, czyli platformę, która umożliwia przechowywanie repozytoriów w chmurze, współpracę z innymi programistami oraz prezentowanie swojego kodu potencjalnym pracodawcom. Ten moduł będziesz realizować równolegle z kursem – dam Ci znać w odpowiednim momencie, kiedy warto go przerobić, aby w pełni wykorzystać jego możliwości w swoich projektach.

    • Podstawowe informacje na temat systemów kontroli wersji
    • Working area, staging area, local / remote repository
    • Instalacja Git
    • Inicjalizacja repozytorium
    • Konfiguracja i personalizacja ustawień Git (3 poziomy konfiguracji)
    • Dokumentacja Git
    • Struktura katalogu .git
    • Plik .gitignore
    • Plik .gitattributes
    • Śledzenie stanu, porównywanie plików projektu zarządzanego przez Git
    • Tworzenie commitów
    • Reset, restore, revert
    • Prezentowanie informacji na temat commitów
    • Hooks
    • Tworzenie i zarządzanie gałęziami
    • Merge, rebase, squash
    • Git Flow, TBD
    • Praca zespołowa z wykorzystaniem GitHub
    • Clone, push, fetch, pull
    • Dobre praktyki przygotowania repozytorium na GitHub
    • Struktura pliku README.md
    • Praktyczny przykład pracy zespołowej z wykorzystaniem GitHub
    • Worktree
    • Submodules
    • Subtree
    • Stash
    • Bisect
    • Tags
    • Inne komendy Git (o których nie wspomniałem w tym opisie, a których użyłem w kursie)
    • Praca z Git, GitHub z wykorzystaniem komercyjnego IDE
    • Fork
    • Tworzenie pull requests
    • GitHub Desktop

    Newsletter