סיכום – מחלקת String
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 26 מתוך 104.
אתגר
קלנבנה מחלקת String שלמה שמנהלת מערך תווים דינמי משלה, ומשלבת את כל המושגים של בנאים והורסים מהפרק הזה. זהו תרגיל קלאסי המדמה את אופן הפעולה הפנימי של std::string.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
String.h: הגדירו את המחלקהStringשלכם בהתאם לכלל חמשת הכללים. המחלקה שלכם צריכה לנהל מצביעchar*בשםdataואיברsize_t length. ממשו:- בנאי ברירת מחדל שיוצר מחרוזת ריקה (הקצו תו יחיד לתו סיום null, הגדירו את האורך ל-0). הדפיסו
"Default constructed" - בנאי עם פרמטרים שמקבל
const char*ומעתיק את מחרוזת ה-C לזיכרון שהוקצה לאחרונה. הדפיסו"Constructed: <text>" - בנאי העתקה שמבצע העתקה עמוקה של אובייקט String אחר. הדפיסו
"Copied: <text>" - בנאי העברה (מסומן ב-
noexcept) שמעביר את הבעלות. הדפיסו"Moved: <text>"תוך שימוש בטקסט לפני איפוס המקור - הורס שמשחרר את הזיכרון בבטחה (בדקו אם הוא null). הדפיסו
"Destroyed: <text>"(הדפיסו"Destroyed: (empty)"אם data הוא null או אם האורך הוא 0) - מתודת
size()שמחזירה את האורך - מתודת
c_str()שמחזירה את מצביע התווים (החזירו""אם הוא null)
- בנאי ברירת מחדל שיוצר מחרוזת ריקה (הקצו תו יחיד לתו סיום null, הגדירו את האורך ל-0). הדפיסו
main.cpp: הדגימו כיצד כל הבנאים פועלים יחד. קראו מחרוזת טקסט מהקלט, ואז:- צרו
Stringבשםs1באמצעות בנאי ברירת המחדל - צרו
Stringבשםs2עם טקסט הקלט - צרו
Stringבשםs3על ידי העתקתs2 - צרו
Stringבשםs4על ידי העברה מתוךs2 - הדפיסו
"--- Status ---" - עבור כל מחרוזת (s1 עד s4), הדפיסו
"s<n>: \"<text>\" (length: <len>)"
- צרו
השתמשו ברשימות אתחול בכל הבנאים לשם יעילות. לאחר ההעברה, s2 אמור להיות ריק באורך 0, בעוד ש-s4 מכיל את הטקסט המקורי. הודעות ההורסים בסוף יציגו את ניקוים של כל ארבעת האובייקטים בסדר הפוך לסדר יצירתם.
כללו את <cstring> עבור strlen ו-strcpy, ואת <utility> עבור std::move(). אל תשכחו להוסיף guards לכותרת בקובץ הכותרת שלכם.
נסו בעצמכם
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: צרו את String s1 באמצעות בנאי ברירת המחדל
// TODO: צרו את String s2 עם טקסט הקלט
// TODO: צרו את String s3 באמצעות העתקת s2
// TODO: צרו את String s4 באמצעות העברה מ־s2 (השתמשו ב־std::move)
// הדפיסו כותרת מצב
cout << "--- Status ---" << endl;
// TODO: הדפיסו את המצב של כל מחרוזת מ־s1 עד s4
// פורמט: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין