Pemrograman C++ Modern

C++03 / C++11 / C++14 / C++17 / C++20 / C++23 / C++26
Kursus akses terbuka ini ditujukan bagi mereka yang sudah familiar dengan C dan pemrograman berorientasi objek menuju tingkat kemahiran pemrograman C++. Kursus ini mencakup dasar-dasar pemrograman C++ dan beralih ke semantik dan konsep C++ tingkat lanjut.
Fitur utama :
- Gratis dan sering diperbarui
- 26 ceramah, 1800+ slide
- Sertakan konsep dan fitur standar bahasa terakhir
- Pengajaran praktis : deskripsi terstruktur singkat dan non-verbose yang terkait dengan kode
- Contoh kode minimal untuk menampilkan fitur atau masalah tertentu saja tanpa menyimpang
- Aspek bahasa pelengkap : alat, konvensi pengkodean, organisasi proyek, dan optimalisasi kode
- Berbasis pengalaman : banyak aspek, contoh, dan masalah berasal dari kasus dunia nyata yang saya hadapi selama saya bekerja sebagai insinyur perangkat lunak
Jika Anda menikmati kursus ini atau merasa bermanfaat , silakan tambahkan Bintang
BAB
| # | JUDUL | FOKUS UTAMA |
|---|
| 1 | Pendahuluan (html) | Sejarah C/C++, Area aplikasi, Pengenalan kursus |
| 2 | Persiapan (html) | Buku, Cara menyusunnya, Halo dunia |
| 3 | Konsep Dasar I (html) | Tipe Sistem, Tipe Fundamental, dan Operator |
| 4 | Konsep Dasar II (html) | Tipe Integral dan Floating-point serta aritmatikanya |
| 5 | Konsep Dasar III (html) | Entitas, Enumerator, Struktur, Pernyataan alur kontrol |
| 6 | Konsep Dasar IV (html) | Heap, Stack, Pointer, Referensi, Properti Const, Operator konversi |
| 7 | Konsep Dasar V (html) | Fungsi, ekspresi Lambda, arahan Prapemrosesan |
| 8 | Pemrograman Berorientasi Objek I (html) | Hierarki kelas, Konstruktor, Destruktor, Kata kunci kelas |
| 9 | Pemrograman Berorientasi Objek II (html) | Polimorfisme, Operator kelebihan beban |
| 10 | Template dan Pemrograman Meta I (html) | Templat fungsi, Tipe ciri, Utilitas waktu kompilasi |
| 11 | Template dan Pemrograman Meta II (html) | Templat kelas, SFINAE |
| 12 | Unit Penerjemahan I (html) | Kaitan dan Aturan Satu Definisi |
| 13 | Unit Terjemahan II (html) | Berurusan dengan beberapa unit dan file terjemahan, #include , Modules |
| 14 | Konvensi Kode I (html) | Organisasi proyek, pengenalan konvensi kode, konvensi entitas |
| 15 | Konvensi Kode II (html) | Templat, namespace, c++ modern, kemudahan perawatan, penamaan, dan konvensi pemformatan |
| 16 | Debugging dan Pengujian (html) | Eksekusi/debug memori, Sanitizer, teknik Harding, Tes unit, Pengembangan Berbasis Tes |
| 17 | Ekosistem (html) | Cmake, Dokumentasi, dan Alat Lainnya |
| 18 | Utilitas (html) | Perpustakaan std utama |
| 19 | Kontainer, Iterator, dan Algoritma (html) | Kontainer, Iterator, Algoritma, Rentang |
| 20 | Topik Lanjutan I (html) | Pindahkan semantik, Referensi universal, Pengurangan tipe |
| 21 | Topik Lanjutan II (html) | Penanganan kesalahan, idiom C++, Smart pointer |
| 22 | Optimasi Kinerja I (html) | Hukum Ahmdal, Batasan kinerja, Konsep arsitektur (ILP, SIMD, dll.), Hierarki memori |
| 23 | Optimasi Kinerja II (html) | Pengoptimalan aritmatika, pengoptimalan memori, dll. |
| 24 | Optimasi Kinerja III (html) | Pengoptimalan kompiler, Pembuatan Profil, Alat Pembandingan |
| 25 | Desain Perangkat Lunak I (html) | Konsep Dasar, Prinsip, Kasus Penggunaan |
| 26 | Desain Perangkat Lunak II (html) | Pola Desain dan Idiom |
BUKU ALL-IN-ONE : modern-cpp.pdf (mungkin ada beberapa komitmen di belakang), html
TOPIK SECARA RINCIAN
1. Pendahuluan
- Sedikit Sejarah Bahasa Pemrograman C/C++
- Area Aplikasi dan Popularitas
- Filsafat C++
- Kelemahan C++ : Alternatif C++, Mengapa sulit beralih ke bahasa baru?
- Kursus
2. Persiapan
- Buku dan Referensi
- Legenda Geser
- Editor/IDE/Kompiler Apa yang Harus Saya Gunakan?
- Bagaimana cara mengkompilasinya?
- Halo Dunia : Aliran I/O
3. Konsep Dasar Sistem Tipe I, Tipe Fundamental, dan Operator
- Sistem Tipe C++ : Tipe kategori, Tipe properti
- Ikhtisar Tipe Dasar C++ : Tipe aritmatika, Akhiran dan awalan, Tipe aritmatika non-standar, tipe
void , nullptr - Aturan Konversi
- Kata Kunci
auto - Operator C++ : Operator yang diutamakan, semantik kenaikan/pengurangan Prefix/Postfix, Operator Penugasan, gabungan, dan koma, Operator Pesawat Luar Angkasa
<=> , Operator perbandingan yang aman
4. Konsep Dasar II - Tipe Integral dan Floating-point
- Tipe Data Integral : Bilangan bulat dengan lebar tetap,
size_t , ptrdiff_t , uintptr_t , Semantik Operasi Aritmatika, Promosi, Pemotongan, Perilaku tidak terdefinisi, Aritmatika Saturasi - Jenis dan Aritmatika Titik Mengambang : Standar titik mengambang IEEE dan representasi lainnya, Nilai Normal/Denormal, Tak Terhingga, Bukan Angka (
NaN ), Epsilon Mesin, Satuan di Tempat Terakhir (ULP), Lembar Curang, Batas dan fungsi yang berguna, Aritmatika properti, Perilaku nilai khusus, Perilaku tidak terdefinisi, Deteksi kesalahan floating-point - Masalah Floating-point : Pembatalan bencana, Perbandingan floating-point
5. Konsep Dasar III - Entitas dan Aliran Pengendalian
- Entitas
- Deklarasi dan Definisi
- Enumerator
-
struct , Bitfield, union - Aliran Kontrol : pernyataan
if , perulangan for dan while , perulangan rentang-basis for , switch , goto , Hindari peringatan variabel yang tidak digunakan - Namespace : Namespace global eksplisit, alias namespace,
using -deklarasi, using namespace -directive, namespace inline - Atribut :
[[nodiscard]] , [[maybe_unused]] , [[deprecated]] , [[noreturn]]
6. Konsep Dasar IV - Konsep Memori
- Pointer : Operasi penunjuk, Alamat operator
& , akses anggota struct , penunjuk void , Konversi penunjuk, Aritmatika penunjuk, Penunjuk liar dan menjuntai - Heap dan Stack : Memori tumpukan,
new , delete , Alokasi penempatan non-alokasi, Alokasi non-lempar, Kebocoran memori - Inisialisasi : Inisialisasi variabel, Inisialisasi seragam, Inisialisasi array, Inisialisasi struktur, Pengikatan Struktur, Inisialisasi memori dinamis
- Referensi
- Ekspresi
Const dan Konstan : Konstanta dan literal, const , constexpr , consteval , constinit , if constexpr , std::is constant evaluated() , if consteval - kata kunci
volatile - Konversi Tipe Eksplisit :
static_cast , const_cast , reinterpret_cast , Tipe punning, std::bit_cast , Konversi inisialisasi seragam, gls::narrow_cast -
sizeof Operator : ikhtisar, [[no_unique_address]]
7. Konsep Dasar V - Fungsi dan Preprocessing
- Fungsi : Nilai lewat, Penunjuk lewat, Referensi lewat, Tanda tangan fungsi dan kelebihan beban, Kelebihan beban dan
=delete , Parameter default - Penunjuk Fungsi dan Objek Fungsi
- Ekspresi Lambda : Daftar pengambilan, Ekspresi Lambda dan relasi fungsi, Catatan parameter, Komposabilitas, Rekursi,
constexpr/consteval , template , mutable , [[nodiscard]] , Daftar pengambilan dan kelas - Pemrosesan awal : Praprosesor, Kesalahan umum, Makro lokasi sumber, Makro kompilasi bersyarat, Operator stringisasi (
# ), #error dan #warning , #pragma , Operator penempelan token ## , Makro variadik
8. Pemrograman Berorientasi Objek I - Konsep Kelas
- Kelas C++ : idiom RAII
- Hirarki Kelas
- Penentu akses : Penentu akses warisan, Kapan menggunakan
public/protected/private untuk anggota data? - Konstruktor Kelas : Konstruktor default, Inisialisasi kelas, Inisialisasi seragam untuk objek, Konstruktor delegasi, kata kunci
explicit , [[nodiscard]] dan kelas - Salin Konstruktor
- Penghancur Kelas
- Konstruktor, Destruktor, dan Operator Default (
= default ) - Kata Kunci Kelas :
this , static , const , mutable , using , friend , delete
9. Pemrograman Berorientasi Objek II - Polimorfisme dan Kelebihan Operator
- Polimorfisme : Mekanisme C++ untuk polimorfisme, metode
virtual , Tabel virtual, kata kunci override , kata kunci final , Kesalahan umum, Metode virtual murni, Kelas abstrak dan antarmuka - Pengecoran Warisan dan Identifikasi Jenis Run-time
- Kelebihan Operator : Ikhtisar, Operator perbandingan
< , Operator pesawat ruang angkasa <=> , Operator subskrip [] , Operator subskrip multidimensi [] , Operator panggilan fungsi () , operator statis [] dan operator () , Operator konversi T() , Kelebihan beban tipe kembalian resolusi, Operator penambahan dan pengurangan ++ / -- , Operator penugasan = , Operator aliran << , Catatan operator - Tata Letak Objek C++ : Agregat, Kelas sepele, Kelas tata letak standar, Data lama biasa (POD), Hierarki
10. Templat dan Pemrograman Meta I - Templat Fungsi dan Utilitas Waktu Kompilasi
- Templat Fungsi : Ikhtisar, Instansiasi templat, Parameter templat, Parameter templat - nilai default, Kelebihan muatan, Spesialisasi
- Variabel Templat
- Tipe Parameter Templat : Catatan Tipe Generik, Placeholder
auto , Tipe parameter templat kelas, Tipe array dan penunjuk, Tipe fungsi - Utilitas Waktu Kompilasi :
static_assert , using kata kunci, kata kunci decltype - Tipe Sifat : Ikhtisar, Pustaka tipe sifat, Manipulasi tipe
11. Template dan Pemrograman Meta II - Template Kelas dan SFINAE
- Templat Kelas : Spesialisasi kelas, Konstruktor templat kelas
- Pengurangan otomatis template konstruktor (CTAD)
- Templat Kelas - Konsep Tingkat Lanjut : Kelas + Fungsi - spesialisasi, Nama dependen -
typename dan kata kunci template , Hirarki dan using templat kelas, kata kunci friend , Argumen templat templat - Pemrograman Meta Templat
- SFINAE: Kegagalan Pergantian Bukan Kesalahan : Fungsi SFINAE, Kelas SFINAE
- Templat Variadik : Ekspresi lipat, templat kelas Variadik
- Konsep C++20 : Ikhtisar, kata kunci
concept , requires klausa, requires ekspresi, requires ekspresi + klausa, requires klausa + ekspresi, requires dan constexpr , requires bersarang - Proses Debug Templat
12. Unit Penerjemahan I - Kaitan dan Aturan Satu Definisi
- Konsep Dasar : Satuan Penerjemahan, Lingkup Lokal dan Global, Keterkaitan
- Kelas dan Durasi Penyimpanan : Durasi penyimpanan, Kelas penyimpanan, kata kunci
static , Namespace anonim, kata kunci extern - Keterkaitan
const dan constexpr : Kegagalan urutan inisialisasi statis - Ringkasan Keterkaitan
- Berurusan dengan Beberapa Unit Terjemahan : Kelas dalam beberapa unit terjemahan
- Aturan Satu Definisi (ODR) : Masalah variabel global, ODR - Poin 3, fungsi/variabel
inline , constexpr dan inline - ODR - Templat Fungsi : Kasus, kata kunci
extern - ODR - Templat Kelas : Kasus, kata kunci
extern - Perilaku dan Ringkasan ODR Tidak Terdefinisi
13. Unit Terjemahan II - Sertakan, Modul, dan Namespace
-
#include Masalah : Sertakan penjaga, Deklarasi penerusan, Ketergantungan melingkar, Kesalahan tautan yang umum - Modul C++20 : Ikhtisar, Terminologi, Visibilitas dan jangkauan, Jenis unit modul, Kata kunci, Fragmen modul global, Fragmen modul pribadi, Unit modul header, Partisi modul
- Mengompilasi Beberapa Unit Terjemahan : Flag kompiler dasar, Metode Kompilasi
- Perpustakaan di C++ : Perpustakaan statis, Membangun perpustakaan statis, Menggunakan perpustakaan statis, Perpustakaan dinamis, Membangun perpustakaan dinamis, Menggunakan perpustakaan dinamis, Antarmuka biner aplikasi (ABI), Demangling, Menemukan dependensi perpustakaan dinamis, Menganalisis objek/simbol yang dapat dieksekusi
14. Kode Konvensi I
- Organisasi Proyek C++ : Direktori proyek, File proyek, catatan organisasi proyek "Umum", Alternatif - Organisasi proyek "Canonical"
- Gaya dan Konvensi Pengkodean : Ikhtisar, Gaya pengkodean populer
- File Header dan
#include : #include guard, #include sintaksis, urutan #include , Konvensi umum header/nama file sumber - Prapemrosesan : Makro, pernyataan prapemrosesan
- Variabel : variabel global
static , konversi - Enumerator
- Tipe Aritmatika : Tipe integral bertanda tangan vs. tak bertanda, konversi tipe integral, Tipe integral: ukuran dan permasalahan lainnya, Tipe floating-point
- Fungsi : Parameter fungsi, Argumen fungsi, nilai kembalian fungsi, Penentu fungsi, ekspresi lambda
- Struktur dan Kelas :
struct vs class , Inisialisasi, Daftar penginisialisasi yang dikurung, Fungsi anggota khusus, =default , =delete , Masalah lain, Warisan, Gaya
15. Kode Konvensi II
-
auto - Templat dan Pengurangan Jenis
- Aliran Kontrol : Aliran kontrol redundan,
if/else , Perbandingan, switch , for/while - Namespace :
using namespace , Namespace anonim/tanpa nama, Namespace dan desain kelas, Style - Fitur C++ Modern : Kata Kunci, Fitur, Kelas, Perpustakaan
- Pemeliharaan : Pemahaman kode, Fungsi, Templat dan Debuction, Perpustakaan
- Portabilitas
- Penamaan : Entitas, Variabel, Fungsi, Konvensi gaya, Menerapkan gaya penamaan
- Keterbacaan dan Pemformatan : Spasi horizontal, Penunjuk/Referensi, Spasi vertikal, Tanda kurung kurawal, Dekorator tipe, Kurangi verbositas kode, Masalah lainnya
- Dokumentasi Kode : Dokumentasi fungsi, Sintaks komentar, Dokumentasi file
16. Debugging dan Pengujian
- Ikhtisar Proses Debug
- Pernyataan
- Debugging eksekusi : Breakpoints, Watchpoints / Catchpoints, Aliran kontrol, Stack dan info, Cetak, Bongkar,
std::breakpoint - Debug Memori :
valgrind - Teknik Pengerasan : Penggunaan tumpukan, Pemeriksaan perpustakaan standar, Perlindungan perilaku tidak terdefinisi, Perlindungan aliran kontrol
- Pembersih : Pembersih alamat, Pembersih kebocoran, Pembersih memori, Pembersih perilaku tidak terdefinisi, Pembersih berbasis sampel
- Ringkasan Proses Debug
- Peringatan Kompiler
- Analisis Statis
- Pengujian Kode : Pengujian unit, Test-Driven Development (TDD), Cakupan kode, pengujian Fuzz
- Kualitas Kode :
clang-tidy
17. Ekosistem - Cmake dan Alat Lainnya
- CMake :
cmake dan ctest - Dokumentasi Kode :
doxygen - Statistik Kode : Menghitung baris kode, Penganalisis kompleksitas cyclomatic
- Alat Lainnya : Pemformatan kode -
clang-format , Compiler Explorer , Transformasi kode - CppInsights , penyelesaian kode bertenaga AI - Pencarian kode lokal - ugrep , ripgrep , hypergrep , Mesin pencari kode - searchcode/grep.app , Pembandingan kode - Quick-Bench , Font untuk pengkodean
18. Utilitas
- Aliran I/O : Manipulator,
ofstream/ifstream - String :
std::string , Konversi dari/ke nilai numerik, std::string_view , std::format , std::print - Tampilan :
std::span - Perpustakaan Matematika
- Nomor Acak : Konsep dasar, C++
<random> , Seed, periode dan kualitas PRNG, Distribusi, Algoritma dan Kinerja terkini, Kuasi-acak - Pengukur Waktu : Waktu Jam Dinding, Waktu Pengguna, Waktu Sistem
- Templat Kelas Std :
std::pair , std::tuple , std::variant , std::optional , std::any , std::stacktrace - Perpustakaan Sistem File : Metode kueri, Modifikasi metode
19. Kontainer, Iterator, dan Algoritma
- Kontainer dan Iterator
- Wadah Urutan :
std::array , std::vector , std::deque , std::list , std::forward_list - Wadah Asosiatif :
std::set , std::map , std::multiset - Adaptor Kontainer :
std::stack , std::queue , std::priority_queue - Menerapkan Iterator Kustom : Menerapkan Iterator sederhana
- Catatan Iterator :
- Metode Utilitas Iterator :
std::advance , std::next , std::prev , std::distance , Metode akses kontainer, ciri-ciri Iterator - Perpustakaan Algoritma :
std::find_if , std::sort , std::accumulate , std::generate , std::remove_if - Rentang C++20 : Konsep utama, Tampilan rentang, Adaptor rentang, Pabrik rentang, Algoritme rentang, Tindakan rentang
20. Topik Lanjutan I
- Pindahkan Semantik : referensi
lvalues dan rvalues , Pindahkan semantik, std::move , semantik deklarasi kelas - Referensi Universal dan Penerusan Sempurna : Referensi universal, Aturan penciutan referensi, Penerusan sempurna
- Kategori Nilai
-
& , && Ref-kualifikasi dan Overloading volatile - Salin Elision dan RVO
- Jenis Pengurangan : Referensi lewat, Penunjuk lewat, Nilai lewat, pengurangan
auto , auto(x) : Salinan peluruhan -
const Kebenaran
21. Topik Lanjutan II
- Perilaku Tidak Terdefinisi: Perilaku ilegal, Perilaku spesifik platform, perilaku tidak ditentukan, Mendeteksi perilaku tidak terdefinisi
- Penanganan Kesalahan : Penyerahan kesalahan yang dapat dipulihkan, Kode pengembalian, Pengecualian C++, Mendefinisikan pengecualian khusus, kata kunci
noexcept , Masalah alokasi memori, Kode pengembalian dan ringkasan pengecualian, std::expected , Pendekatan penanganan kesalahan alternatif - Petunjuk cerdas :
std::unique_ptr , std::shared_ptr , std::weak_ptr - Konkurensi : Metode thread, Mutex, Atom, Paralelisme berbasis tugas
22. Optimasi I - Konsep Dasar
- Pendahuluan : Hukum Moore, Batasan Hukum Moore, Alasan dilakukannya optimasi
- Konsep Dasar : Kompleksitas asimtotik, Pertukaran Waktu-Memori, Siklus Perkembangan, Hukum Ahmdal, Throughput, Bandwidth, Latensi, Batasan kinerja, Intensitas aritmatika
- Konsep Arsitektur Dasar : Throughput Instruksi (IPC), Eksekusi In-Order, dan Out-of-Order, Pipelining instruksi, Paralelisme tingkat instruksi (ILP), Hukum Little, Paralelisme tingkat data (DLP) dan instruksi vektor (SIMD), Paralelisme tingkat thread (TLP), Single Instruksi Multiple Threads (SIMT), RISC, set instruksi CISC
- Hirarki Memori : Konsep hierarki memori, Lokalitas memori, Latensi inti-ke-inti dan afinitas thread, Model pengurutan memori
23. Optimasi II - Optimasi Kode
- Operasi I/O :
printf , I/O yang dipetakan memori, Mempercepat pemuatan data mentah - Optimasi Memori : Memori heap, Memori tumpukan, Pemanfaatan cache, Penyelarasan data, Prefetch Memori
- Tipe Aritmatika : Tipe data, Operasi aritmatika, Konversi, Titik mengambang, Fungsi intrinsik penyusun, Nilai dalam rentang, Tabel pencarian
- Aliran Kontrol : Cabang, Petunjuk Cabang -
[[likely]] / [[unlikely]] , Bilangan bulat yang ditandatangani/tidak ditandatangani, Loop, Pengangkatan loop, Pembukaan loop, Pernyataan, Petunjuk kompiler [[assume]]/std::unreacheable() , Rekursi - Fungsi : Biaya pemanggilan fungsi, Pengoperan argumen, Inlining fungsi, Atribut fungsi, Aliasing pointer
- Pemrograman Berorientasi Objek
- Perpustakaan Std dan Aspek Bahasa Lainnya
24. Optimasi III - Optimasi dan Benchmarking Non-Coding
- Optimasi Kompiler : Tentang kompiler, Bendera optimasi kompiler, Bendera optimasi floating-point, Bendera optimasi linker, Bendera arsitektur, Membantu kompiler untuk menghasilkan kode yang lebih baik, Optimasi terpandu profil (PGO), Pengoptimal biner pasca-pemrosesan, Optimasi polihedral
- Teknik Transformasi Penyusun : Transformasi dasar, Pengalihan loop, Penggabungan loop, Pembelahan loop, Pertukaran loop, Pengelompokan loop
- Perpustakaan dan Struktur Data
- Tolok Ukur Kinerja : Apa yang harus diuji?, Kualitas beban kerja/Dataset, Perilaku cache, Performa CPU yang stabil, Pertimbangan multi-thread, Tata letak memori program, Overhead pengukuran, Optimasi kompiler, Evaluasi metrik
- Pembuatan profil :
gprof , uftrace , callgrind , cachegrind , perf profiler Linux - Komputasi Paralel : Konkurensi vs. paralelisme, Penskalaan kinerja, Hukum Gustafson, Bahasa pemrograman paralel
25. Perancangan Perangkat Lunak I - Konsep Dasar (DRAFT)
- Buku dan Referensi
- Konsep Dasar : Abstraksi, antarmuka, dan modul, Class Invariant
- Prinsip Desain Perangkat Lunak : Pemisahan perhatian, Kopling rendah, kohesi tinggi, Enkapsulasi dan penyembunyian informasi, Desain berdasarkan kontrak, Dekomposisi masalah, Penggunaan kembali kode
- Kompleksitas Perangkat Lunak : Entropi perangkat lunak, Hutang teknis
- Prinsip Desain SOLID
- Desain Kelas : Prinsip antarmuka kelas, fungsi Anggota vs. fungsi bebas, fungsi namespace vs. metode statis kelas
- Studi Kasus BLAS GEMM
- Memiliki Objek dan Tampilan
- Nilai vs. Referensi Semantik
- Variabel Global
26. Desain Perangkat Lunak II - Pola dan Idiom Desain (DRAFT)
- Idiom C++ : Aturan Nol, Aturan Tiga, Aturan Lima
- Pola Desain : Singleton, Pointer to Implementation (PIMPL), Curious Recurring Template Pattern (CRTP), Fungsi Virtual Template
Peta jalan
- Tingkatkan Bab Desain Perangkat Lunak
- Bab Aspek Pembangunan (misalnya mengurangi waktu pembangunan)
Melaporkan bug? dan berkontribusi
Jika Anda menemukan kesalahan ketik, kesalahan konseptual, atau bagian yang perlu diperbaiki, harap laporkan melalui panel issue .
Pengarang
Federico Busato , https://federico-busato.github.io/
- LinkedIn: www.linkedin.com/in/federico-busato/
- Twitter: twitter.com/fedebusato