פונקציות סטטיות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 4 מתוך 61.
כשמפצלים קוד לכמה קבצים, כל פונקציה שמוגדרת בקובץ מקור גלויה כברירת מחדל לקבצים אחרים. אבל לפעמים צריך פונקציות עזר שאמורות לשמש רק באופן פנימי: פונקציות שקבצים אחרים לא אמורים לגשת אליהן או אפילו לדעת על קיומן.
מילת המפתח static, כשהיא מוחלת על פונקציה, מגבילה את הנראות שלה לקובץ שבו היא מוגדרת. כך נוצרת פונקציה פרטית שאי אפשר לקרוא לה מקובצי מקור אחרים, גם אם מישהו מנסה להצהיר עליה.
// math_utils.c
#include "math_utils.h"
// פונקציית עזר פרטית - גלויה רק בקובץ הזה
static int square(int x) {
return x * x;
}
// פונקציה ציבורית - אפשר לקרוא לה מתוך main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
בדוגמה הזאת, sum_of_squares מוצהרת בקובץ הכותרת ואפשר להשתמש בה בכל מקום. עם זאת, square מסומנת כ-static, ולכן היא קיימת רק בתוך math_utils.c. אם main.c תנסה לקרוא ישירות ל-square(), המקשר יפיק שגיאה: הפונקציה פשוט לא קיימת מחוץ לקובץ שלה.
זו הדרך של C להשיג כימוס ברמת הקובץ. פונקציות סטטיות מאפשרות לך להסתיר פרטי מימוש ולשמור על ממשק ציבורי נקי, תוך שימוש בכל לוגיקת עזר שנחוצה לך באופן פנימי.
אתגר
קלבואו נבנה מחשבון מרחק שמשתמש בפונקציית עזר פרטית כדי לחשב ריבוע של מספר: פרט שצריך להישאר מוסתר משאר התוכנית.
תיצרו שלושה קבצים:
distance.h: קובץ הכותרת שלכם, שמצהיר על פונקציה ציבורית יחידהdistance_squaredשמקבלת ארבעה מספרים שלמים (x1, y1, x2, y2) המייצגים שתי נקודות ומחזירה מספר שלם. הוסיפו הגנות הכללה באמצעות הסמלDISTANCE_H.distance.c: קובץ המקור שלכם, שמכיל את המימוש. צרו פונקציית עזרstaticבשםsquareשמקבלת מספר שלם ומחזירה את הריבוע שלו. פונקציית העזר הזאת צריכה להיות גלויה רק בתוךdistance.c. לאחר מכן, ממשו אתdistance_squaredבאמצעות פונקציית העזר הסטטית שלכם, כדי לחשב את (x2-x1)² + (y2-y1)².main.c: הקובץ הראשי שלכם, שכולל את קובץ הכותרת ומשתמש בפונקציה הציבורית. פונקציית העזרsquareלא צריכה להיות נגישה כאן: רקdistance_squaredזמינה.
הפונקציה distance_squared מחשבת את ריבוע המרחק האוקלידי בין שתי נקודות. כשמגדירים את הפונקציה square כסטטית, אתם מסתירים את פרט המימוש הזה מכל קוד שמחוץ ל-distance.c.
תקבלו ארבעה קלטים של מספרים שלמים: x1, y1, x2, ו-y2.
הדפיסו את ריבוע המרחק בפורמט הזה:
Squared distance: {result}לדוגמה, עבור הנקודות (0, 0) ו-(3, 4), הפלט יהיה:
Squared distance: 25נסו בעצמכם
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: קראו ל-distance_squared עם הקואורדינטות שהוזנו
// והדפיסו את התוצאה בפורמט: "Squared distance: {result}"
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין