C++ Cheat Sheet: דף עזר מהיר
עודכן לאחרונה
Hello World ומבנה התוכנית
הריצה מתחילה ב-main, שמחזירה int.
| רכיב | קוד |
|---|---|
| הכללת קובץ כותרת | #include <iostream> |
| נקודת כניסה | int main() { ... } |
| הדפסת שורה | std::cout << "Hello, World!" << std::endl; |
| קריאת קלט | std::cin >> x; |
| שימוש ב-namespace std | using namespace std; |
| החזרת הצלחה | return 0; |
| הערות | // line ו-/* block */ |
טיפוסי נתונים
| טיפוס | תיאור |
|---|---|
int | מספר שלם (בדרך כלל 32 ביט) |
long / long long | מספרים שלמים רחבים יותר |
float / double | מספרים בנקודה צפה |
char | בייט / תו יחיד |
bool | true או false |
std::string | טקסט דינמי מתוך <string> |
auto | הקומפיילר מסיק את הטיפוס |
std::size_t | טיפוס ללא סימן לגדלים ולאינדקסים |
משתנים ורפרנסים
רפרנסים הם כינויים; מצביעים מחזיקים כתובות.
| פעולה | תחביר |
|---|---|
| הצהרה ואתחול | int x = 5; |
| אתחול בסוגריים מסולסלים | int x{5}; |
| קבוע | const double PI = 3.14159; |
| קבוע בזמן קומפילציה | constexpr int N = 10; |
| רפרנס (כינוי) | int &r = x; |
| מצביע | int *p = &x; |
| גישה דרך מצביע | *p = 10; |
| הסקת טיפוס | auto y = 3.14; |
בקרת זרימה
| משפט | תחביר |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| לולאת while | while (i < n) { ... } |
| לולאת do-while | do { ... } while (i < n); |
| לולאת for | for (int i = 0; i < n; i++) { ... } |
| for מבוסס טווח | for (auto x : vec) { ... } |
| for מבוסס טווח ברפרנס | for (auto &x : vec) { ... } |
| Break / continue | break; יוצא מהלולאה, continue; מדלג לאיטרציה הבאה |
פונקציות
| פעולה | תחביר |
|---|---|
| הגדרת פונקציה | int add(int a, int b) { return a + b; } |
| ללא ערך החזרה | void greet() { ... } |
| ארגומנטים עם ערך ברירת מחדל | int pow(int b, int e = 2) { ... } |
| העברה ברפרנס | void inc(int &x) { x++; } |
| רפרנס const (בלי העתקה) | void print(const std::string &s) { ... } |
| העמסה (Overloading) | int max(int a, int b); ו-double max(double a, double b); |
| Lambda | auto f = [](int x) { return x * 2; }; |
| Lambda עם capture | auto g = [n](int x) { return x + n; }; |
מחלקות ו-OOP
| פעולה | תחביר |
|---|---|
| הגדרת מחלקה | class Dog { ... }; |
| מגדירי גישה | public:, private:, protected: |
| משתנה מחלקה | std::string name; |
| בנאי | Dog(std::string n) : name(n) {} |
| הורס (Destructor) | ~Dog() { ... } |
| פונקציה חברה | void bark() { ... } |
| יצירת אובייקט | Dog d("Rex"); |
| ירושה | class Puppy : public Dog { ... }; |
| פונקציה וירטואלית | virtual void speak(); |
קונטיינרים של STL
קונטיינרים נפוצים מהספרייה הסטנדרטית.
| קונטיינר | שימוש ודוגמה |
|---|---|
std::vector<int> | מערך דינמי: v.push_back(1); v.size(); |
std::string | טקסט: s += "!"; s.length(); |
std::array<int, 3> | מערך בגודל קבוע עם מידע על הגבולות |
std::map<K, V> | מפתח-ערך ממוין: m["a"] = 1; |
std::unordered_map<K, V> | טבלת גיבוב (חיפוש מהיר יותר, בלי סדר) |
std::set<T> | ערכים ייחודיים ממוינים: s.insert(5); |
std::pair<A, B> | שני ערכים: make_pair(1, "x") |
std::queue / std::stack | מתאמים של תור FIFO / מחסנית LIFO |
אלגוריתמים ואיטרטורים של STL
מתוך <algorithm>; רובם מקבלים טווח איטרטורים begin/end.
| פעולה | תחביר |
|---|---|
| איטרטורי התחלה / סוף | v.begin(), v.end() |
| מיון | std::sort(v.begin(), v.end()); |
| מיון בסדר יורד | std::sort(v.begin(), v.end(), std::greater<int>()); |
| חיפוש ערך | auto it = std::find(v.begin(), v.end(), 5); |
| ספירת התאמות | std::count(v.begin(), v.end(), 5); |
| האיבר המינימלי / המקסימלי | std::max_element(v.begin(), v.end()); |
| סכום של טווח | std::accumulate(v.begin(), v.end(), 0); |
| שינוי כל איבר | std::transform(v.begin(), v.end(), v.begin(), fn); |
Smart pointers ו-C++ מודרני
העדיפו smart pointers על פני new/delete גולמיים לניקוי אוטומטי.
| יכולת | תחביר |
|---|---|
| בעלות ייחודית | auto p = std::make_unique<Dog>("Rex"); |
| בעלות משותפת | auto p = std::make_shared<Dog>("Rex"); |
| רפרנס ללא בעלות | std::weak_ptr<Dog> w = p; |
| סמנטיקת העברה (Move) | auto v2 = std::move(v1); |
| Nullptr | int *p = nullptr; |
| Structured bindings | auto [key, val] = *it; |
| ערך אופציונלי | std::optional<int> maybe; |
| תבניות (Templates) | template <typename T> T add(T a, T b) { return a + b; } |
התחביר, הקונטיינרים של STL והיכולות המודרניות של C++ שהכי שימושיים, בעמוד אחד. ה-C++ cheat sheet הזה הוא דף עזר מהיר לכתיבת C++: טיפוסי הנתונים, רפרנסים, מחלקות, הקונטיינרים של הספרייה הסטנדרטית כמו vector ו-unordered_map, וה-smart pointers שמחליפים את new/delete הגולמיים.
כל מה שכאן הוא C++ סטנדרטי (C++11 ואילך) ומתקמפל עם g++ או clang++. העתיקו את מה שצריך, או נסו כל קטע קוד בזמן אמת בעורך האונליין של C++, בלי להתקין קומפיילר. לומדים את השפה? קורס C++ האינטראקטיבי והחינמי של Coddy מלמד מצביעים, STL ומחלקות צעד אחר צעד.
שאלות נפוצות על ה-C++ cheat sheet
האם ה-C++ cheat sheet הזה בחינם?
מה ההבדל בין מצביע לרפרנס ב-C++?
*p. רפרנס (int &r = x) הוא כינוי למשתנה קיים: חייבים לקשור אותו כבר בהצהרה, הוא אף פעם לא יכול להיות null או להיקשר מחדש, ומשתמשים בו כמו במשתנה עצמו. השתמשו ברפרנסים לפרמטרים נקיים יותר שמועברים ברפרנס, ובמצביעים כשצריך הפניה אופציונלית או כזו שאפשר לשנות.כדאי להשתמש ב-new/delete או ב-smart pointers?
std::unique_ptr ו-std::shared_ptr (דרך make_unique/make_shared) משחררים את הזיכרון שלהם אוטומטית כשהם יוצאים מה-scope, וכך מונעים את הדליפות והשחרורים הכפולים שמגיעים עם new/delete ידניים. השתמשו ב-new/delete גולמיים רק בקוד low-level שיש לו סיבה מוגדרת לכך.