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.
Już teraz
zapisz się na kurs
- C plus plus
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ą
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
Materiały video
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #2
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #1
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #5
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #5
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #4
-

Nowoczesny C++ w praktyce. Lista dwukierunkowa z pełnym wsparciem STL. #3











