C++ 3D logosu yanında iki C++ standart kütüphane modül küpü bembeyaz arka planda premium kompozisyon

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.