C++/שלום עולם!

מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.

< C++
קפיצה אל: ניווט, חיפוש


נתחיל מהצגת תוכנית שלום עולם!, כנהוג להתחיל ספרים על שפות תכנות:

#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    return 0;
}

תוכן עניינים

[עריכה] הסבר

זהו קוד מקור של תוכנית פשוטה, שכל מטרתה היא לפלוט באיזשהו אמצעי פלט את הטקסט "Hello, world!".

נסביר את הקוד בפרטים:

  • הפקודה ‎#include היא פקודה לקדם-מעבד (pre-processor), כך הן כל הפקודות המתחילות בסולמית. קדם-מעבד הוא חלק מהמהדר, והוא מורץ בתחילת תהליך ההידור. פקודת ה-include מורה לקדם-מעבד להדביק את תוכן הקובץ ששמו נכתב אחרי הפקודה, לתוך המקום בו נכתבה הפקודה עצמה. משתמשים בפקודה זו על מנת להכליל את ההצהרות של הספרייה בה אנו רוצים להשתמש, במקרה שלנו "iostream".
iostream היא חלק מהספרייה התקנית של C++‎ האחראי על קלט ופלט (Input/Output Stream). כל הספריות התקניות יבואו בסוגריים משולשים לאחר פקודת ה-include, זאת כדי שהמהדר ימצא את הקובץ לבד. במקרה של הספריה התקנית של C++‎, לאו דווקא קיים קובץ כזה על הדיסק הקשיח שלכם, דבר זה תלוי בסביבת הפיתוח בה אתם עובדים.
  • השורה int main() פותחת את הגדרת פונקציית main, זוהי השורה שממנה תתחיל להתבצעה התוכנית. הסוגריים המסולסלים פותחים וסוגרים בלוק של פקודות שתתבצענה בזמן הרצת התוכנית, כל השורות הנמצאות מחוץ לסוגריים אלה, משמשות אותנו רק בזמן ההידור. את הפרטים על פונקציות תלמדו בהמשך.
  • הסימן >> משמעותו "פלוט את מה שמימין לתוך מה שמשמאל". במקרה שלנו אנו פולטים את המחרוזת (טקסט) "Hello, world!‎" לתוך ה-stream ששמו std::cout. שימו לב שמשמעות סימן זה יכולה להשתנות ממקום למקום בהתאם למה שנכתב מימין ומשמאל (ראו העמסת אופרטורים).
  • השם std::cout מורכב משני חלקים: הראשון (std) מציין את מרחב השם של הספריה התקנית, ואילו החלק השני (cout) הוא שם של אובייקט הנמצא בתוך מרחב שם זה. בקצרה ניתן לסכם זאת כך: אנו פולטים לתוך אובייקט cout התקני.
האובייקט cout מוגדר בספרייה iostream, ולשם השימוש בו הכללנו אותה בשורה הראשונה. כאשר אנו פולטים לתוך האובייקט cout, הפלט נשלח לאיזשהו אמצעי פלט במערכת. ברוב המערכות אמצעי פלט זה הוא המסך, כברירת מחדל. אם תריצו תוכנית זו, כנראה גם במערכת שלכם תראו את המילים "Hello, world!‎" מוצגות בחלון/מסך טקסט (ידוע בשם קונסולה).
  • את המחרוזות ב-C++‎ נכניס לתוך גרשיים על מנת להבדיל משאר הקוד הניתן לביצוע. שימו לב שהגרשיים לא יופיעו בפלט. שני הסימנים האחרונים במחרוזת \n‎ מייצגים תו אחד הנקרא "ירידת שורה" (Line Feed או New Line). מקור התו הזה, ועוד תווים שונים אחרים, הוא בתחילת הסטוריית המדפסות שלא נספר עליה כאן. במקרה שלנו אנו מורידים את סמן הפלט לשורה חדשה, כך שכל הפלט הבא (שאיננו כאן) יופיע בשורה הבאה.
מטעמי נוחות ותואמות למערכות אחרות, נהוג לפעמים להשתמש בכתיב std::endl לירידת שורה (ראה דוגמה למטה). כתיב זה כמעט זהה בפעולתו לזה שבתוכנית המוצגת כאן.
  • ההוראה return 0; מחזירה את הערך 0 למערכת, ערך זה מסמל סיום תוכנית מוצלח. כל ערך השונה מאפס מסמל שגיאה בזמן ריצת התוכנית. הוראה זו הכרחית בכל הפונקציות שמחזירות ערך, חוץ מפונקציית main, אומנם בשל האחידות רבים כותבים אותה גם כאן.
  • כל הוראה ב-C++‎, מלבד הוראות הבקרה, תסתיים בנקודה-פסיק ולא בסוף שורה (כמו בחלק מהשפות), כך נוכל לפרק הוראות ארוכות למספר שורות.

[עריכה] בניה והרצה

כדי ללמוד לתכנת יש להריץ את התוכניות שנכתבו (על אף שבמקרים מסויימים כתיבת קוד היא אך ורק פעילות תיאורטית). לצורך זה תצטרכו להדר אותם באמצעות מהדר וכאשר אתם תכתבו תוכניות גדולות שתתפוסנה יותר מקובץ אחד תצטרכו גם לקשר באמצעות מקשר.

ניפוי השגיאות הוא חלק בלתי נפרד מפיתוח תוכנות גדולות. העדר אפשרות הרצת התוכנית תחת מנפה שגיאות, במערכות זמן אמת לדוגמה, מקשה על פיתוח תוכנות אלה. מנפה שגיאות טוב יכול לתרום לכם להבנה של אופן פעולת התוכנית; הוא מאפשר להריץ קטעים שמתבצעים במשך כמיקרון השנייה, שורה אחר שורה.

בהתאם למערכת שבה אתם עובדים תצטרכו ללמוד להשתמש בכלים הקיימים בה.


פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.

[עריכה] g++ בלינוקס וCygwin

{{{גודל}}}

כדאי לדעת:

מהדר ה-g++‎ הוא מהדר C++‎ נפוץ למגוון פלטפורמות.

  • לסביבת חלונות, ניתן להוריד את חבילת mingw הכוללת אותו מכאן.
  • עבור סביבת לינוקס, אם אינו מותקן כבר, ניתן להתקינו דרך מנהל החבילות של ההפצה בה אתם משתמשים.



השימוש במהדר g++ זהה כמעט לחלוטין לשימוש במהדר ה-gcc (כאשר במקום gcc כותבים g++‎), ומי שכבר למד להשתמש בו יכול לדלג על חלק זה.

כדי להדר תוכנית משורת הפקודה, כותבים את השורה הבאה:

g++ myprogram.cpp


הפקודה תיצור קובץ הרצה בשם a.out, או תדפיס הודעות שגיאה מתאימות. כדי להדר כמה קבצים ביחד, כותבים אותם בשורה, בזה אחר זה:

g++ prog1.cpp prog2.cpp prog3.cpp


הפקודה תיצור קובץ הרצה המורכב מכל הקבצים יחד. בצורה זו, ניתן ליצור תוכנית מכמה קבצים שונים. כדי לשלוט בשם קובץ ההרצה הנוצר, נשתמש בדגל -o, בצורה הבאה:

g++ myprog.cpp -o Program


אם נרצה רק להדר קובץ, אך עדיין לא ליצור ממנו קובץ הפעלה, נשתמש בדגל -c:

g++ -c myprogram.cpp


פקודה זו תיצור קובץ בשם myprogram.o, שאינו קובץ הרצה, אך ניתן לקשר אותו עם קבצים אחרים. נניח, למשל, שהתוכנית שלנו כוללת את הקבצים prog1.cpp, prog2.cpp ו-main.cpp, אז ניתן להדר אותה בעזרת רצף הפקודות:

g++ -c prog1.cpp
g++ -c prog2.cpp
g++ main.cpp prog1.o prog2.o -o Program


כפי שראיתם, ניתן להדר קבצי .o וקבצי .cpp יחד. הסיבה היא שפעולת הקישור - יצירת התוכנית הכוללת, ופעולת ההידור, הן שתי פעולות נפרדות. דגל נוסף שכדאי להכיר הוא -Wall. דגל זה מורה למהדר לכתוב כל הודעת אזהרה אפשרית, ובכך מסייע רבות בזיהוי בעיות אפשריות. לכן, כדי להדר את התוכנית שכתבנו, בהנחה ששמרנו אותה בקובץ hello.cpp, נשתמש בפקודה הבאה:

g++ -Wall hello.cpp -o Hello


כתוצאה מכך, יווצר קובץ הרצה בשם Hello בתיקיה בה אנו עובדים. ניתן להריץ את הקובץ ולקבל את פלט התוכנית.

[עריכה] סביבת פיתוח בחלונות

{{{גודל}}}

כדאי לדעת:

ברוב סביבות הפיתוח בחלונות, הרצת תוכנית כזו תפתח חלון אשר ייסגר מיד לאחר סיום התכנית, דבר שעלול להקשות על קריאת הפלט. אם הדבר אכן קורה, אפשר להוסיף שתי שורות לקוד, שיראה עתה כך:

#include <iostream>
#include <conio.h>
 
int main()
{
    std::cout << "Hello, world!\n";
    getch();
    return 0;
}

לאחר הוספת שורות אלו, החלון יישאר פתוח עד שתקישו מקש כלשהו. כך תוכלו לראות את הפלט לפני שהחלון ייסגר.




[עריכה] Microsoft Visual Studio

אם אתם משתמש ב-Microsoft Visual Studio, תוכלו לפעול לפי הצעדים הבאים. על אף שקיימים הבדלים בין גרסות שונות, הם אינם משמעותיים. בגרסה 2005 ניתן לעשות זאת כך:

  • פרוייקט חדש – כנסו לתפריט File → New → Project...‎‏. מצאו תחת קטגוריה "Visual C++‎" את סוג הפרוייקט "Win32 Console Application" ובחרו אותו. הזינו שם לפרוייקט ואת המסלול בו תיווצר התיקיה של הפרוייקט. ניתן להוריד את הסימון "Create Directory for Solution", על מנת שתיווצר תיקייה אחת פחות. לחצו על OK. באשף שיפתח, עברו ל-Application Settings או לחצו על Next. בחלון זה סמנו את "Empty project" וסיימו עם לחיצת Finish. כעת נוצרה לכם תיקייה במסלול שהזנתם עם שם הפרוייקט ובה קבצים של הפרוייקט; כרגע הוא ריק.
  • יצירת קובץ C++‎ חדש – כדי ליצור קובץ C++‎ חדש, כנסו לתפריט Project → Add New Item...‎. מהחלון שנפתח בחרו את סוג הקובץ "C++ File" והזינו את שם הקובץ (לדוגמה main.cpp), מותר להזין את שם הקובץ גם ללא הסיומת, היא תתווסף אוטומטית.
  • הוספת קובץ C++‎ קיים – כדי להוסיף קובץ C++‎ קיים, רצוי תחילה להעתיקו לתיקיית הפרויקט. לאחר מכן יש לבחור מהתפריט Project → Add Existing Item...‎. בחלון שיופיע, יש לבחור את הקבצים שברצונכם להוסיף.
  • עריכת קוד – על מנת לערוך את אחד מקבצי הפרוייקט, יש ללחוץ עליו פעמיים בחלון "Solution Explorer".
  • הידור והרצה – כדי לבנות את הפרוייקט (להדר ולקשר), יש לבחור את Build → Build Solution. אם ההידור יעבור בהצלחה יווצר קובץ הרצה בתיקיית Debug בתוך תיקיית הפרוייקט. כדי להריץ תחת מנפה שגיאות יש לבחור את Debug → Start Debugging. אם יהיו שגיאות בזמן ההידור, הן תופענה בחלון Output או Task List. לחיצה כפולה על שגיאה תביא אותכם לשורה בה הייתה השגיאה.

לא צוינו כאן קיצורי המקשים, מכיוון שהם יכולים להשתנות. כמו כן תוכלו לשנות את ההגדרות (אם הן עדיין לא כאלה) כך שהפרוייקט יהודר אוטומטית בכל פעם כשאתם מריצים (לרוב על ידי מקש F5). במקרה זה, כדאי להגדיר כך שלא תורץ הגרסה האחרונה שהודרה במקרה שהיו שגיאות הידור בגרסה חדשה.

כברירת מחדל מהודרת גרסת Debug של הפרוייקט. בגרסה זו, המהדר אינו עושה אופטימיזציה; בנוסף, הוא משאיר מידע נוסף בקובץ ההרצה החיוני למנפה שגיאות, דבר המגדיל מעט את קובץ ההרצה. כאשר תרצו להדר גרסה סופית של הפרוייקט (כדי להפיצו למשל), תוכלו לבחור ב-Release במקום Debug (בתוך תיבה על סרגל הכלים הראשי).

כאשר תרצו להקטין את נפח הפרוייקט (למשל כשתגבוהו או תשלחוהו במייל), תוכלו לנקותו מתפריט Build → Clean Solution או למחוק ידנית את תיקיות ה-Debug וה-Release ואת הקבצים עם הסיומות: ncb, suo, user, aps (תחילה יש לסגור את סביבת הפיתוח).

[עריכה] סביבות פיתוח אחרות

השתמש בסביבת הפיתוח שלך כדי להדר את הקוד. אם ההידור יעבור בהצלחה, יווצר קובץ מתאים בעל סיומת exe, ויהיה ניתן להריצו.


פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.

[עריכה] סגנון הקוד בהמשך הספר

כתיבת הקידומת std::‎ לפני כל פנייה לכלי מהספריה התקנית, לא נוחה. בתוכנות קטנות בהן אין בעייה של עומס שמות משתמשים לרוב במשפט using namespace std. משפט זה מציין למהדר שאנחנו ניפנה לשמות של הספריה הסטנדרטית ללא הקידומת std::‎. ברוב קטעי הקוד בספר לא נוסיף קידומת זו:

#include <iostream>
using namespace std;
 
int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}

זאת דוגמה לדברים שנאמרו למעלה: אין כאן תוספת ה-std::‎, והשתמשנו ב-endl. שימו לב כיצד שרשרנו את הפלט באמצעות מספר אופרטורי ה->>.

כמו כן, לרוב לא נכתוב תוכניות שלמות, אלא רק קטעי קוד קצרים:

cout << "Here is a \" quote." << endl;

כדי להדר קטעים אלה תצטרכו להוסיף אותם לתוך פונקציית main ולהכליל את הספריות המתאימות.

דבר סגנוני נוסף הוא ההזחות שבקוד. הזחה היא הוספת רווחים בתחילת השורה, לרוב משתמשים בטאבים לצורך זה. גודל הטאב הנפוץ בקרב מתכנתי C++‎, הינו 4 רווחים, כמו כן מתכנתים אחרים יכולים להעדיף גם אורך אחר, לדוגמה 2 רווחים מקובלים בתכנות בסביבות פיתוח טקסטואליות. ב-C++‎ אין שום משמעות לרווחים בעיני המהדר אבל היתרון בהוספת רווחים במקום זה או אחר הוא שיפור הקריאות של הקוד. מוסכמה גורפת בקרב המתכנתים (גם בשפות אחרות) היא שקוד הנמצא בתוך בלוק פקודות (בין סוגריים מסולסלים ב-C++‎) יוזח ימינה מעט יותר מהבלוק בו הוא נמצא. לגבי הימצאות הסוגריים עצמם, רווחים בתוך ביטויים או רווחים אחרי משפטי בקרה – אין כללים.

[עריכה] הערות

הערה בקוד מקור של שפת תכנות היא קטע מהקוד שהמהדר מתעלם ממנו. הערות נכתבות בעיקר כדי להקל על קריאת הקוד על ידי אדם. במקרים נדירים הערות משמשות עבור תוכנות אוטומטיות לכתיבת קוד, לדוגמה אשפים. כמו כן בעת כתיבת הקוד וניפוי השגיאות נוח "לכבות" מספר שורות שלא תתבצענה, במקרה כזה מכניסים אותן לתוך הערה כך שהמהדר יתעלם משורות אלה.

ב-C++‎ קיימים שני סוגי הערות:

  • אלה הנמשכות עד לסוף השורה. מתחילים את ההערה ב: // (שני קווים נטויים).
  • אלה הנפרסים על מספר שורות. מתחילים אותם בכל מקום ב: ‎/*‎ (קו נטוי וכוכבית) ומסיימים ב: ‎*/‎ (כוכבית וקו נטוי).

לדוגמה:

/* This code demonstrates
    the type of comments in
    C++ */
 
#include <iostream> // For std::cout
using namespace /* A comment in the middle of a line */ std;
 
// Here the program starts execution.
int main()
{
    cout << "Hello, world!\n";
    return 0;
}

בספר זה נשתמש בהערות מהסוג: /* ... */ ו-‎// ...‎ כדי לסמן בקוד שבמקום זה נמצא קוד שלא נכתב. זאת כדי לא לחזור על אותו קוד משני שכבר נזכר למעלה פעמים נוספות וגם כאשר במקום זה נוכל לכתוב כל קוד שהוא.

[עריכה] קישורים חיצוניים


הפרק הקודם:
מבוא
שלום עולם! הפרק הבא:
משתנים