C++‎

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

קפיצה אל: ניווט, חיפוש
הספר הראשון לשפת ++C

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

תוכן עניינים

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

ביארן סטרוסטרופ, יוצר השפה

פיתוח השפה החל בשנת 1979 על ידי ביארן סטרוסטרופ ממעבדות בל, כאשר הוא החל את עבודתו על הגרסה הראשונה בשמה C with classes (דהיינו "C עם מחלקות"). סטרוסטרופ רצה ליצור שפה חדשה שתשלב את היתרונות של Simula, שפה מונחת עצמים איטית, יחד עם היתרונות של BCPL, שפה מהירה שקרובה לשפת הסף עליה מבוססת C.

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

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

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

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

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

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

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

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

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

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

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

[עריכה] הגבלת גישה

הגבלת הגישה לרכיבי המחלקה השונים מהווה כלי מרכזי למימוש עקרון הכימוס. ישנן שלוש רמות של הגבלות גישה:

  • פרטי (private) – רק שיטות המחלקה יכולות להשתמש בהם.
  • שמור (protected) – רק שיטות המחלקה ומחלקות שנורשות ממנה יכולות להשתמש בהם.
  • ציבורי (public) – לכולם יש גישה אליהם.

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

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

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

כאשר מורישים תכונות למחלקה אחת ממחלקה שניה ניתן לעשות זאת באחת משלוש דרכים:

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

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

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

לעומת שפות אחרות, כמו C#‎ לדוגמה, ב-C++‎ אין הבדל בין מחלקות (class) לבין מבנים (struct). גם מחלקות וגם מבנים יכולים להכיל שיטות, לרשת האחד מהשני, להגדיר פונקציות וירטואליות ולהגדיר רמות גישה שונות. ההבדל היחיד הוא שתכונות המבנה מוגדרות ציבוריות כברירת מחדל ואילו תכונות המחלקה כפרטיות.

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

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

[עריכה] טיפוסיות חזקה (Strong Typing)

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

[עריכה] הגדרת הקבוע

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

[עריכה] משתנה ייחוס (reference variable)

ניתן להגדיר משתנים, פרמטרים וערכים מוחזרים כמתייחסים לעצם (reference). הייחוס דומה מאוד להצבעה: כמה משתנים יכולים להתייחס לאותו עצם ולפעול עליו במשותף, כמו שמצביעים שונים יכולים לפעול על אותו עצם. ישנם שני הבדלים עקריים בין מצביע לייחוס: הראשון שהמצביע יכול להיות ריק (NULL) ואילו ייחוס תמיד יתייחס לעצם כלשהו. והשני שמבחינה תחבירית השימוש בייחוס הוא כמו בעצם עצמו ללא האופרטורים * ו <-.

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

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

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

[עריכה] פרמטרים אופציונאלים

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

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

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

[עריכה] ספרית התבניות הסטנדרטית (STL)

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

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

[עריכה] קלט פלט

הקלט והפלט מתבצעים בשפה על ידי stream-ים מהם מבצעים קריאה באמצעות האופרטור << וכתיבה באמצעות האופרטור >>. טיפוסים אלו מוגדרים בעיקר באמצעות הספריות iostream (קלט/פלט סטנדרטי) ו-fstream (קלט/פלט באמצעות קבצים) ובמרבית המהדרים על ידי ספריות נוספות.

למשל תוך שימוש בהגדרת הקלט הסטנדרטי כ-cin והפלט הסטנדרטי כ-cout ניתן לכתוב:

int x;
cout<<"please enter a number: ";
cin>>x;

במקרה כאן הפלט יראה כך:

please enter a number:

והמחשב ימתין לקבלת מספר שלם.


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

תוכנית שלום עולם בשפת C++‎ תראה כך:

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

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

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

  • Stroustrup, Bjarne (2000). The C++ Programming Language, Special Edition, Addison-Wesley. ISBN 0-201-70073-5.
  • Stroustrup, Bjarne (1994). The Design and Evolution of C++. Addison-Wesley. ISBN 0-201-54330-3.
  • Meyers Scott (2005). Effective C++: 55 Specific Ways to Improve Your Programs and Designs, 3rd Edition, Addison-Wesley. ISBN 0-321-33487-6.
  • Meyers Scott (1995). More Effective C++: 35 New Ways to Improve Your Programs and Designs, Addison-Wesley. ISBN 0-201-63371-X.

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

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

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



שפות תכנות

AdaALGOLAwkAssemblyBasicBCPLCC++C#CobolDelphiEiffelForthFortranHaskellJavaLISPLogoMirandaModula-2OberonOcamlPascalPHPPerlPL/IPL/SQLPrologPythonREXXSQLRubySmalltalkVisual BasicVisual Basic .NET