C++ EĞİTİMİ
C++ eğitimi, dili "her şey serbest" değil sahiplik ve değer kategorisiyle düşünerek kullanmaya yönlendirir. Lvalue, rvalue ve xvalue ayrımları operatör seçiminde kullanılır; RAII sahiplik modeline yedirilir, raw pointer kapı dışında bırakılır. Modern C++'ın getirdiği rule of five, move semantics ve perfect forwarding pratik örneklerle çalışılır.
Program sonunda katılımcı, STL container'ı cache locality ve invalidation davranışına göre seçer; exception safety'yi basic, strong ve no-throw garantisiyle ayırt eder. CMake ile cross-platform build, FetchContent ile dependency yönetimi ve clang-tidy ile statik analiz eğitimin temelini oluşturur.
Katılımcı Profili
Bu program, C++'ı sahiplik ve değer kategorisi disiplinle kullanmak isteyen rollere yöneliktir:
- C++ Geliştiriciler: Dil idiom'ları ve modern standart hakimiyeti isteyen mühendisler
- Sistem Programcıları: Linux ve Windows native uygulama yazan roller
- Oyun Geliştiriciler: Unreal Engine veya custom engine üzerinde C++ kullanan ekipler
- Gömülü Geliştiriciler: Performans ve bellek kontrolü gerektiren donanım üzerinde yazanlar
- HFT ve Latency Mühendisleri: Düşük latency hedefiyle C++ tercih eden ekipler
Ön Gereklilikler
Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:
- Herhangi bir dilde OOP (class, inheritance, polymorphism) deneyimi
- C veya C-benzeri dilde temel söz dizimi rahatlığı
- Pointer ve memory model kavramlarına giriş düzeyi aşinalık
- Komut satırı ve derleme süreci ile rahatlık
- CMake veya başka bir build aracıyla temel deneyim
Süresi ve Tarihi
Süre: 4 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.
Kazanımlar
Programın sonunda katılımcı, C++'ı "her şey serbest" diliyle değil, sahiplik ve değer kategorisiyle düşünerek yazar:
- lvalue, rvalue ve xvalue kategorilerini operatör seçiminde kullanır
- RAII'yi sahiplik modeline yedirir, raw pointer'ı kapı dışında tutar
- Rule of five'ı (copy, move, dtor) bilinçle uygular
- Template ile generic kod yazar; SFINAE ve concept'i okuyup yorumlar
- STL container'larını cache locality ve invalidation davranışına göre seçer
- Exception safety'yi basic, strong ve no-throw garantisiyle ayrıştırır
- CMake ile cross-platform build kurar, FetchContent ile dependency yönetir
Eğitim materyalleri ISO C++ referans alınarak hazırlanır.
C++ Eğitimi Konuları
1. C++ Mirası ve Modern Sürüm Manzarası
- C ile uyumluluk mirası ve kopma noktaları
- Modern C++ standart akışı (11, 14, 17, 20, 23)
- Sistem programlama, oyun ve HFT alanlarındaki yeri
- Sıkça karşılaşılan eski-yeni stil çatışması
2. Derleme Süreci, Toolchain ve Build Sistemleri
- GCC, Clang, MSVC derleyici farkları
- Preprocess, compile, assemble, link aşamaları
- CMake ve Conan/vcpkg ile paket yönetimi
- Cross-compile ve target triple kavramı
3. Tipler, auto ve Type Deduction
- Temel tipler, fixed-width tipler (cstdint)
- auto, decltype ve decltype(auto)
- Type alias ve using deklarasyonu
- const, constexpr, consteval, constinit ayrımı
- Implicit dönüşüm ve narrowing conversion riski
4. Referans, lvalue ve rvalue
- lvalue ve rvalue değer kategorileri
- lvalue reference (&) ve rvalue reference (&&)
- Reference collapsing kuralı
- std::move ve std::forward kullanım sınırı
5. Pointer ve Smart Pointer Mirası
- Raw pointer, reference ve smart pointer ayrımı
- unique_ptr ile tek sahiplik
- shared_ptr ve referans sayımı maliyeti
- weak_ptr ile döngüsel referansı kırma
- make_unique, make_shared'ın avantajı
6. Move Semantics ve Perfect Forwarding
- Move constructor ve move assignment
- Gereksiz kopyalardan kaçınma stratejisi
- Universal reference (T&&) ve forwarding
- std::forward ile argüman yönlendirme
- Copy elision ve RVO/NRVO mantığı
7. RAII - Kaynak Yönetiminin Bel Kemiği
- RAII (Resource Acquisition Is Initialization) prensibi
- Constructor ile kaynak edinme, destructor ile bırakma
- Exception safety: basic, strong, nothrow garanti
- Scope guard ve cleanup pattern
- std::lock_guard, std::unique_lock RAII örneği
8. Class, Constructor, Destructor ve Rule of Five
- Class tasarımı: public, protected, private
- Default, copy, move constructor üretimi
- Rule of Three, Five ve Zero
- Explicit constructor ve implicit dönüşüm engeli
- = default, = delete ile niyet bildirimi
9. Inheritance ve Diamond Problem
- Public, protected, private inheritance ayrımı
- Multiple inheritance ve diamond problem
- Virtual inheritance ile diamond çözümü
- Slicing sorunu ve önleme
- Composition over inheritance prensibi
10. Polymorphism ve Virtual Function
- Virtual function ve vtable mekanizması
- override, final anahtarlarıyla niyet
- Pure virtual ve abstract class
- Virtual destructor kuralı (base class için)
- Static polymorphism: CRTP pattern
11. Operator Overloading
- Member ve non-member operator tanımı
- Comparison operatörleri ve consistency
- Three-way comparison (<=>) ve auto-generated
- Stream operator (<<, >>) ile özelleştirme
12. Template - Generic Programming
- Function template ve class template
- Template parameter: type, non-type, template
- Template specialization (full ve partial)
- Variadic template ve parameter pack
- Fold expression ile sade kullanım
13. Template Metaprogramming ve SFINAE
- type_traits ile compile-time tip sorgulama
- SFINAE (Substitution Failure Is Not An Error)
- enable_if pattern'i ve okunabilirlik sınırı
- if constexpr ile derleme zamanı dallanma
14. Concepts ve Constraint
- Concept tanımı ve requires ifadesi
- Standart kütüphane concept'leri: integral, floating_point
- SFINAE üzerinden Concepts'e geçiş
- Daha okunabilir hata mesajları
15. STL Container ve Iterator
- vector, deque, list ve seçim kriteri
- map, unordered_map; set, unordered_set
- array, span, string_view modern kullanımları
- Iterator kategorileri: input, forward, bidirectional, random access
- Iterator invalidation tuzakları
16. STL Algorithm ve Lambda
- for_each, transform, find, accumulate algoritmaları
- sort, partition, nth_element ile sıralama
- Lambda söz dizimi ve capture clause
- Generic lambda ve auto parametre
- Custom comparator ve predicate yazımı
17. Ranges - Pipeline ile Veri Dönüşümü
- Range ve view kavramı
- Pipe (|) operatörü ile zincirleme
- filter, transform, take, drop view'ları
- Eager ve lazy evaluation farkı
18. Exception Handling ve noexcept
- try, catch, throw ve exception hiyerarşisi
- std::exception ve custom exception sınıfı
- noexcept ile fonksiyon istisna garantisi
- Stack unwinding ve destructor güvenliği
- Hata kodu ve exception arasında seçim
19. constexpr ve Compile-Time Computation
- constexpr fonksiyon ve değişken
- consteval ile zorunlu compile-time
- constexpr STL fonksiyonları
- Compile-time hesaplama avantajı
20. Modules - Header Devrinin Sonu
- module, import söz dizimi
- Header'a göre derleme süresi kazancı
- Modüle ihracat ve ABI sınırı
- Hibrit projelerde modules entegrasyonu
21. Coroutines - co_await, co_yield, co_return
- Coroutine kavramı ve stackless yapısı
- co_await, co_yield, co_return anahtar kelimeleri
- Generator ve async task pattern
- Promise type ve awaiter customization
22. Multithreading - thread, mutex, atomic
- std::thread oluşturma ve join/detach
- mutex, lock_guard, scoped_lock
- condition_variable ile bekleme
- std::atomic ve memory order
- std::async, std::future, std::promise
- jthread ve stop_token (cooperative cancellation)
C++ EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları
lvalue ve rvalue ayrımı pratikte ne işe yarar?
lvalue 'bellekte adres alabilen' nesne (named variable). rvalue ise geçici, taşınabilir değer. Bu ayrım move semantics'in temelidir — rvalue argümanı alan fonksiyon kaynağı 'çalabilir' (move). std::move bir lvalue'yu rvalue'ya cast eder. Eğitimde xvalue ve prvalue alt türleri de tartışılır.
Rule of five ne zaman zorunlu hale gelir?
Sınıf raw pointer veya manuel kaynak (file handle, socket) yönetiyorsa rule of five (copy ctor, copy assign, move ctor, move assign, destructor) zorunludur. Rule of zero ise tüm üyeleri RAII tip (smart pointer, std container) ise compiler defaultları yeterli — kural beşin yerine sıfırı tercih ederiz.
STL container seçimi cache locality ile nasıl ilişkili?
std::vector contiguous memory — cache-friendly, iteration hızlı. std::list dağınık node'lar — cache miss yüksek, iteration yavaş. std::deque bloklu yapı — orta. Pratikte küçük objelerde vector neredeyse her zaman daha hızlı, list teorik avantajı (O(1) insertion) gerçek hayatta zor kazanır.
Exception safety guarantee seviyeleri ne anlama gelir?
Basic guarantee: exception sonrası nesne geçerli ama belirsiz durumda. Strong guarantee: ya işlem tamamlanır ya hiç olmaz (commit-or-rollback). No-throw guarantee: hiç exception fırlatmaz. swap idiomu strong guarantee kurmak için kritik. Eğitimde STL operasyonlarının hangi seviyede olduğu özet tabloyla gösterilir.
CMake FetchContent ile dependency yönetimi pratik mi?
FetchContent küçük projelerde sade — CMakeLists içinde git URL ile dependency çekilir, ayrı paket yöneticisi gerekmez. Ancak büyük projelerde Conan veya vcpkg daha olgun: binary cache, versioned package ve dependency çözümleme sunar. Pratik karar proje ölçeğine ve takım tercihine bağlı.
Move semantics yanlış kullanılırsa hangi hatalara yol açar?
std::move sonrası kaynağı taşınmış nesneyi kullanmak undefined behavior. Move ctor'da exception fırlatmak rule of five'ı bozar. Move'u const reference parametreye uygulamak hiçbir etki yapmaz (sessizce kopyalanır). Eğitimde clang-tidy ve compiler warning'lerle bu pattern'lerin tespiti gösterilir.



