תיעוד C++
מדריך עיון תמציתי ל-C++, מבוסס דוגמאות. קוראים את המושג, רואים את הקוד, ואז מתרגלים אותו במסלול של Coddy.
להתחיל מסלול C++ מודרךGetting Started
- מה זה C++מה זה בעצם C++, למה היא מתקמפלת ישירות לקוד מכונה נייטיב, ואילו סוגי תוכנה עתירת ביצועים בונים איתה.
- Hello Worldתוכנית Hello World ב-C++ מוסברת שורה אחר שורה: #include <iostream>, int main(), std::cout ו-<<, std::endl מול '\n', return 0, ובנוסף איך לקמפל אותה ולתקן את השגיאות הראשונות שמתחילים נתקלים בהן.
- התקנת C++איך להתקין קומפיילר C++ (GCC, Clang או MSVC), לבחור ערכת כלים למערכת ההפעלה שלכם ולוודא משורת הפקודה שהוא עובד.
- הידור C++איך C++ הופכת קוד מקור .cpp לקובץ הרצה נייטיב: מהדרים עם g++ (או clang++/MSVC), מריצים את הבינארי וקוראים את שגיאות המהדר כשמשהו משתבש.
- תחביר C++כללי התחביר הבסיסיים של תוכנית C++: פקודות ונקודה-פסיק, בלוקים בסוגריים מסולסלים, הפונקציה main ואיך פלט עובד, בהסבר שמתחיל מתוכנית ראשונה.
- הערותאיך כותבים הערות ב-C++: הערות של שורה אחת עם // ובלוקים של כמה שורות עם /* */, איך להפוך קוד להערה, למה הערות בלוק לא מקוננות ומה הופך הערה לשווה שמירה.
Variables & Types
- משתניםאיך משתנים עובדים ב-C++: הצהרה עם טיפוס, ההבדל בין השמה לאתחול, אתחול עם סוגריים מסולסלים, כללי שמות, וה-scope שקובע איפה משתנה חי ואיפה הוא מת.
- טיפוסי נתוניםסיור מעשי בטיפוסי הנתונים הבסיסיים של C++: מספרים שלמים, נקודה צפה, char ו-bool, וגם גדלים, signed מול unsigned, ליטרלים וסיומות, גלישה, ואיך לבחור את הטיפוס הנכון.
- מילת המפתח autoאיך מילת המפתח `auto` נותנת למהדר להסיק בשבילכם את הטיפוס של משתנה: מה היא מסירה, איפה היא מצטיינת, ואילו מלכודות תופסות מתחילים.
- קבועים ו-constאיך מצהירים על ערכים לקריאה בלבד ב-C++ עם const, ההבדל בין const ל-constexpr, מצביעי const מול מצביעים ל-const, ופונקציות חברות const.
- אופרטוריםלמדו את האופרטורים של C++: חשבון, השוואה, לוגיקה, השמה ופעולות על סיביות, ובנוסף את המלכודות של חילוק שלמים, קדימות והערכה מקוצרת.
- המרת טיפוסיםאיך המרת טיפוסים עובדת ב-C++: המרות מרומזות, מלכודת החילוק בשלמים, וארבעת ה-casts בעלי השם (static_cast, const_cast, reinterpret_cast, dynamic_cast), עם הפרטים שגורמים לאובדן נתונים שקט.
Control Flow
- if-elseאיך מקבלים החלטות ב-C++ עם if, else if ו-else: תנאים, שרשור הסתעפויות, קינון, האופרטור הטרנרי, if עם אתחול, והמלכודות שמכשילות מתכנתים.
- switchמשפט switch ב-C++ בהסבר ברור: תוויות case, break ו-fall-through, ענף ה-default, קיבוץ מקרים, switch על enums, והמלכודות סביב הצהרות בתוך case.
- לולאת forאיך חוזרים על קוד עם לולאת for ב-C++: הכותרת בת שלושת החלקים, ספירה למעלה ולמטה, מעבר על מערכים, קינון, break ו-continue, והבאגים של off-by-one ו-unsigned שפוגעים בכולם.
- לולאות whileלולאת while ב-C++ בהסבר ברור: ה-while שבודק את התנאי קודם, ה-do-while שרץ לפחות פעם אחת, לולאה עד ערך זקיף, break ו-continue, ואיך להימנע מלולאות אינסופיות.
- for מבוסס טווחלולאת for מבוססת טווח ב-C++ בהסבר ברור: מעבר נקי על מערכים, vectors, מחרוזות ו-maps, למה כדאי להשתמש ב-auto& וב-const auto&, ומלכודות ההעתקה וביטול האיטרטורים שכדאי להימנע מהן.
Functions
- פונקציותאיך כותבים פונקציות ב-C++: המבנה של טיפוס החזרה, שם ופרמטרים, הצהרות מול הגדרות, החזרת ערכים, פונקציות void, ומלכודות כמו return חסר ושכחת prototypes.
- פרמטרים של פונקציותאיך ארגומנטים נכנסים לפונקציות ב-C++: העברה לפי ערך מול לפי הפניה, הפניות const לגישה זולה לקריאה בלבד, ארגומנטים ברירת מחדל, מצביעים, ומלכודות עלות ההעתקה שמאטות תוכניות בשקט.
- הפניותהפניות ב-C++ בהסבר ברור: איך ה-& בפרמטר יוצר כינוי, למה העברה לפי הפניה חוסכת העתקות ומאפשרת לפונקציה לשנות משתנים של מי שקרא לה, ומתי להשתמש ב-const& ובהפניות לעומת החזרת ערכים.
- העמסת פונקציותהעמסת פונקציות (function overloading) ב-C++ מאפשרת לכמה פונקציות לחלוק שם אחד, כל עוד רשימות הפרמטרים שלהן שונות. למדו איך overload resolution בוחרת את ההתאמה, למה טיפוס ההחזרה לבד לא נחשב, ואילו מלכודות של עמימות וארגומנטים ברירת מחדל כדאי לעקוף.
- Lambdasכתבו פונקציות קטנות ישירות בתוך הקוד עם lambdas ב-C++: התחביר, איך עובדות לכידות (captures), מתי להשתמש ב-`mutable`, ומלכודת הלכידה התלויה שנושכת את כולם.
Pointers & Memory
- מצביעיםמצביעים ב-C++ מוסברים מאפס: הצהרה על מצביע, אופרטור הכתובת & ואופרטור הגישה *, nullptr, מצביעים למערכים, ומלכודות המצביע התלוי והמצביע הלא מאותחל שגורמות לקריסות.
- הפניות מול מצביעיםהשוואה מעשית בין הפניות למצביעים ב-C++: מה משותף להם, במה הם שונים (הפניה מחדש, null, אריתמטיקה), וכלל ברור לבחירה ביניהם בקוד יומיומי.
- זיכרון דינמיאיך מקצים זיכרון בזמן ריצה עם `new`, משחררים אותו עם `delete`, ונמנעים מהדליפות, מהמצביעים התלויים ומה-double-free שמגיעים עם ניהול ידני של ה-heap.
- מצביעים חכמיםמצביעים חכמים מחזיקים בזיכרון heap ומשחררים אותו אוטומטית. למדו את `unique_ptr`, `shared_ptr`, `make_unique` ו-`make_shared`, ולמה כמעט אף פעם לא תצטרכו לכתוב שוב `new`/`delete`.
Strings & I/O
- מחרוזותאיך משתמשים ב-`std::string` ב-C++: בנייה, חיבור, חיפוש וחיתוך של טקסט בבטחה, ולמה כמעט אף פעם לא תרצו `char*` גולמי לעבודה אמיתית.
- קלט ופלטאיך עובד קלט ופלט בקונסולה ב-C++: הדפסה עם cout, קריאה עם cin, הבאג הקלאסי של שורה חדשה ב-getline אחרי cin, ואיך להתאושש כשהקלט נכשל.
- std::getlineאיך std::getline קורא שורה שלמה לתוך std::string: שימוש עם cin, למה הוא מחזיר מחרוזת ריקה אחרי cin >>, התיקונים עם cin.ignore ו-std::ws, תווי הפרדה מותאמים, וקריאת קובץ שורה אחרי שורה עד סוף הקובץ.
- String Streamsאיך משתמשים ב-std::stringstream, ב-istringstream וב-ostringstream כדי לפענח טקסט, לפצל מחרוזות לפי רווחים, להמיר בין מחרוזות למספרים ולבנות מחרוזות מעוצבות בזיכרון.
STL Containers
- מערכיםמערכים גולמיים ב-C++ בהסבר ברור: איך מצהירים עליהם ומאתחלים אותם, ניגשים לאינדקסים בבטחה, עוברים עליהם בלולאה לפי הגודל, מלכודת ה-decay למצביע, ולמה std::array ו-vector בדרך כלל עדיפים.
- vectorstd::vector הוא המערך בגודל משתנה של C++, הקונטיינר שכדאי לבחור בו כברירת מחדל. למדו ליצור vector, לגשת לאיברים, להגדיל אותו ולעבור עליו בלולאה, וגם את המלכודות של ביטול iterators וגישה מחוץ לגבולות.
- mapstd::map ב-C++ בהסבר ברור: מכולה ממוינת של זוגות מפתח-ערך עם חיפוש לוגריתמי. הכנסה, חיפוש, מעבר בלולאה, והימנעות מהמלכודת הקלאסית של operator[] שמכניס מפתחות בשקט.
- unordered_mapלמדו std::unordered_map ב-C++: האח של map שמבוסס על טבלת hash ונותן הכנסה וחיפוש ב-O(1) בממוצע. כולל פעולות בסיס, מלכודת ההכנסה האוטומטית של [], count מול find, ומתי לבחור בו במקום map ממוין.
- setאיך std::set שומר ב-C++ ערכים ייחודיים שממוינים אוטומטית: הכנסה, בדיקת שייכות עם count ו-find, מעבר לפי הסדר, וההבדלים בין set, multiset ו-unordered_set.
- pair ו-tupleאיך `std::pair` ו-`std::tuple` אורזים שניים או יותר ערכים לאובייקט אחד: יצירה, גישה לשדות, structured bindings, ואיפה כל אחד מהם מתאים.
- איטרטוריםאיך איטרטורים ב-C++ עובדים כמצביעים מוכללים לתוך מכולות: begin() ו-end(), גישה לאיבר, התקדמות, גרסאות const ו-reverse, ומלכודות הביטול והגישה ל-end() שגורמות להתנהגות לא מוגדרת.
STL Algorithms & Templates
- אלגוריתמיםהשתמשו באלגוריתמים הסטנדרטיים של C++, `find`, `count_if`, `transform`, `accumulate`, `remove`, כדי לבצע עבודה אמיתית על טווחים בלי לולאות שכתובות ידנית, כולל המלכודות של זוג האיטרטורים ושל erase-remove.
- מיוןמיינו vectors ומערכים ב-C++ עם `std::sort`: סדר ברירת מחדל, פונקציות השוואה מותאמות, מיון structs לפי שדה, ומלכודת ה-strict weak ordering שגורמת לקריסות.
- Templatesכותבים קוד פעם אחת ונותנים לו לעבוד עם כל טיפוס בעזרת templates ב-C++: function templates, class templates, הסקת טיפוסים, ושגיאות הקומפילציה המבלבלות שהן גורמות.
Classes & Objects
- מחלקותלמדו איך מחלקות ב-C++ מאגדות נתונים והתנהגות לטיפוסים לשימוש חוזר: הצהרה על משתנים חברים ומתודות, יצירת אובייקטים, החלוקה בין public ל-private, ומלכודות כמו חברים לא מאותחלים והמצביע this.
- בנאיםבנאי (constructor) הוא הפונקציה החברה המיוחדת שרצה כשאובייקט נוצר. למדו בנאי ברירת מחדל, בנאים עם פרמטרים ובנאי העתקה, רשימות אתחול של חברים, ואיך להימנע מאובייקטים מאותחלים למחצה.
- DestructorsDestructor רץ אוטומטית כשאובייקט מושמד. למדו את התחביר `~ClassName()`, מתי הוא מופעל, למה הוא משחרר משאבים, ואת ה-Rule of Three/Five.
- ירושהאיך ירושה ב-C++ מאפשרת למחלקה נגזרת להשתמש מחדש במחלקת בסיס ולהרחיב אותה: התחביר, ירושה public מול private, סדר הבנאים וההורסים, ומלכודות כמו object slicing.
- פונקציות וירטואליותפונקציות וירטואליות מאפשרות למצביע למחלקת בסיס לקרוא בזמן ריצה לגרסה של המתודה במחלקה הנגזרת. למדו את `virtual`, את `override`, מחלקות אבסטרקטיות, ולמה ה-destructor של הבסיס חייב להיות וירטואלי.
- העמסת אופרטוריםהעמסת אופרטורים ב-C++ מאפשרת לטיפוסים שלכם לעבוד עם אופרטורים מובנים כמו +, == ו-<<. למדו את הכללים של פונקציית איבר מול פונקציה חיצונית, איך מעמיסים אופרטורי השוואה ו-stream, ואת המלכודות סביב טיפוסי החזרה ואופרטור ההשמה.
- Access Specifiersאיך public, private ו-protected קובעים מי יכול לגשת לחברים של מחלקה ב-C++: הבסיס של כימוס (encapsulation), עם getters, setters ופתח המילוט friend.
- Structsstruct ב-C++ בהסבר ברור: איך מאגדים משתנים קשורים לטיפוס אחד, מצהירים על אובייקטי struct ומאתחלים אותם, מוסיפים ל-struct פונקציות חברות ובנאים, ומה ההבדל האמיתי בין struct ל-class.
- enumsלמדו enums ב-C++: איך מצהירים עליהם, למה enum class עם טווח בטוח יותר מ-enum רגיל, ערכים מותאמים אישית, switch על ערכי enum, והמרה אל מספרים שלמים וחזרה.
Errors & Debugging
- חריגותחריגות מדווחות על שגיאות שפונקציה לא יכולה לטפל בהן במקום. למדו איך לבצע `throw`, מהם טיפוסי החריגות הסטנדרטיים, את הודעת `what()`, ולמה חריגות עדיפות על קודי החזרה בכישלונות שחשובים.
- try-catchעוטפים קוד מסוכן ב-`try` ומגיבים ב-`catch`. למדו לתפוס חריגות כהפניה קבועה, לסדר כמה handlers, להשתמש ב-`catch (...)` ולזרוק מחדש, בלי לדלוף משאבים.
- התנהגות לא מוגדרתהתנהגות לא מוגדרת (UB) היא קוד שתקן C++ לא מטיל עליו שום כללים: הוא עלול לקרוס, להשחית נתונים או להיראות כאילו הוא עובד. למדו מה הגורמים הנפוצים, למה "זה רץ בסדר" לא מוכיח כלום, ואילו כלים תופסים UB.