C++‎

מתוך ויקיפדיה, האנציקלופדיה החופשית

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

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

תוכן עניינים

[עריכה] היסטוריה ומקור השם

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

המדריך הראשון לשפת ++C
הגדל
המדריך הראשון לשפת ++C

השפה פותחה החל משנת 1979 ובתחילת שנות ה־80 על־ידי ביארן סטרוסטרופ ממעבדות AT&T, כאשר תחילה נקראה בפשטות C with classes (דהיינו "C עם מחלקות"). הגרסה הראשונה זכתה לשימוש ב־1983 במעבדות AT&T. בשנה זו קיבלה השפה את שמה החדש "++C". הגרסה המסחרית הראשונה הופצה בשנת 1985 יחד עם פרסום המדריך הראשון לשפה על־ידי סטרוסטרופ, כאשר תמיכה בתבניות הוספה רק מאוחר יותר בגרסה השנייה של מדריך זה. השפה תוקננה על־ידי ארגון התקינה הבינלאומי בשנת 1997.

השם C++‎ ניתן על בסיס האופרטור המאפשר הוספת אחד למשתנה המייצג מספר שלם - אופרטור פלוס פלוס הקיים בשפת C.

[עריכה] מבנה השפה

בשפת C++‎ ממומשים העקרונות הכלליים של התכנות מונחה עצמים: כימוס, הורשה ורב־צורתיות (פולימורפיזם). בשונה משפות מונחות עצמים אחרות כמו Java, ההורשה שמאפשרת C++‎ יכולה להיות אפילו הורשה מכמה טיפוסי בסיס, דהיינו הורשה מרובה.

C++‎‎ איננה שפת תכנות מונחה עצמים טהורה, משום שהיא שומרת על המבנה הפרוצדורלי של שפת C, ומאפשרת קידוד פונקציות ללא מעטפת של עצם המחלקה. C++‎ תומכת גם בגישה ישירה למשאבי המחשב, בדומה לשפת C.

מעבר לנושאי תכנות מונחה עצמים, שפת C++‎ הינה גם שפה גמישה יותר משפת C בהבטים רבים.

[עריכה] גמישות במשתנים

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

[עריכה] תכונות פרמטרים של פונקציה

ניתן בשלב ההגדרה של פונקציה לקבוע צורות שונות של התייחסות לפרמטר של פונקציה.

  • אפשר לקבוע אותו כקבוע באמצעות המילה השמורה const, וכך אין אפשרות לשנות את הפרמטר בתוך הפונקציה.
  • ניתן ליצור כפרמטר בפונקציה משתנה הפניה (reference variables), שמעביר את המשתנה לא לפי ערכו אלא לפי המצביע שלו, דבר המאפשר ליצא תוכן מהפונקציה באמצעות הפרמטר.
  • ניתן ליצור פרמטרים אופציונאלים בעלי ערך ברירת מחדל, במידה ולא הוזן ערך, הערך שיקבע בפרמטרים יהיה ערך ברירת המחדל שהוזן להם על ידי כותב הפונקציה.

[עריכה] העמסת פונקציות

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

[עריכה] פונקציות inline

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

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

[עריכה] מבנה struct

מבנה struct הורחב ויכול לכלול בתוכו מלבד משתנים גם שיטות, והוא למעשה מוגדר כמחלקה class, עם בררת מחדל של גישה public.

[עריכה] מחלקה class

המחלקה היא לב לבה של השפה. למחלקה מוגדרים משתנים ושיטות שהן למעשה פונקציות שפועלות על המשתנים של המחלקה.

לכל מחלקה אפשר ליצור פונקציות בנאיות (constructors), ששמן כשם המחלקה ותפקידן לאתחל כל מופע של המחלקה כאשר הוא נוצר, ופונקציה מפרקת (destructor), ששמה כשם המחלקה עם קידומת של תו תלתלית ~, שמופעלת כאשר המופע של המחלקה נמחק.

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

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

[עריכה] העמסת אופרטורים

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

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

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

השפה תומכת גם בפולימורפיזם: ניתן להתייחס לאובייקט דרך מצביע למחלקה שהוא צאצא שלה, ולהפעיל פונקציות של האובייקט (עם מימוש ספציפי לאובייקט) אם הוגדרו בממשק של המחלקה ממנה הוא ירש. מנגנון ה־Run-Time Type Information (‏RTTI) מאפשר לקבל מידע, תוך כדי ריצת התוכנית, על טיבו של המשתנה ולאפשר המרת טיפוסים בטוחה.

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

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

[עריכה] מבנים בשפה

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

תוספות אלו, ירושה מרובה (1989), העמסת אופרטורים (1989), תבניות (1991), ספריה סטנדרטית ו־RTTI ‏(1995) הוכנסו לשפה בהדרגה.

[עריכה] תחביר

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

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

[עריכה] טיפוסים

[עריכה] משתנים

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

[עריכה] מילים שמורות

[עריכה] אופרטורים

[עריכה] מבנה בקרה

[עריכה] פונקציות

[עריכה] דוגמאות

[עריכה] דוגמה לתוכנית Hello world

#include <iostream> // for std::cout and std::endl

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

[עריכה] דוגמת קוד נוספת

דוגמה לשימוש בסיסי בפולימורפיזם:

#include <iostream>


class Bird {               // the "generic" base class
public:
  virtual void OutputName() {std::cout << "a bird";}
};

class Swan : public Bird { // Swan derives from Bird
public:
  void OutputName() {std::cout << "a swan";} // overrides virtual function
};

int main()
{
  Bird* myBird = new Swan; // Declares a pointer to a generic Bird,
                           // and sets it pointing to a newly-created Swan.

  myBird->OutputName();    // This will output "a swan", not "a bird".

  delete myBird;

  return 0;
}

[עריכה] ראו גם

[עריכה] לקריאה נוספת

  • יצחק גרבר, C++‎ כשפת אם,הוצאת BUG, 1995, 608 עמ'.

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

מיזמי קרן ויקימדיה
ויקיספר ספר לימוד בוויקיספר: C++