c programming tutorial - בקלות C++
מדריכי תכנות

שיעור 12: הקדמה למחלקות

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

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

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

מעתה ואילך, נקרא למבנים אלה עם פונקציות מחלקות (אני מניח שמרקס לא יאהב את C). התחביר למחלקות אלה הוא פשוט. ראשית, אתה שם את מילת המפתח 'class' לאחר מכן שם המחלקה. הדוגמא שלנו תשתמש בשם computer. לאחר מכן אתה פותח סוגריים מסולסלות. לפני שמניחים את המשתנים השונים, יש לשים דרגה של הגבלה על המשתנה. יש שלושה שלבים של הגבלה. הראשון הוא public, השני protected, והשלישי private. לעת עתה, כל מה שאתה צריך לדעת זה שהגבלה של public מאפשרת לכל חלק של התוכנית, כולל כזה שאינו חלק מהמחלקה, לגשת למשתנים שמתוארים כ public. הגבלת ה protected מונעת מפונקציות מחוץ למחלקה מלגשת למשתנה. התחביר לזה הוא רק מילת המפתח להגבלה (protected ,private ,public) ואז נקודתיים. לבסוף, שמים את המשתנים השונים והפונקציות (בדרך כלל רק תשים את אב[ות] הטיפוס של הפונקציה) שאתה רוצה שיהיו חלק מהמחלקה. לאחר מכן אתה סוגר את הסוגריים המסולסלות ואחריהם שם נקודה פסיק. זכור שאתה עדיין צריך לסיים את אבות הטיפוס של הפונקציה בנקודה פסיק.

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

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

לדוגמא:

void Aclass::aFunction()
{
  cout<<"Whatever code";
}





#include <iostream.h>

class Computer //Standard way of defining the class
{
 public: 
	//This means that all of the functions below this
 	//(and any variables) are accessible to the rest of the program.
 	//NOTE: That is a colon, NOT a semicolon...

Computer();
	//Constructor
 ~Computer();
	//Destructor
 void setspeed(int p);
 int readspeed();
		//These functions will be defined outside of the class
protected:
   //This means that all the variables under this, until a new type of
   //restriction is placed, will only be accessible to other functions 
   //in the class.  NOTE: That is a colon, NOT a semicolon...
int processorspeed;
};		

   //Do Not forget the trailing semi-colon


Computer::Computer() 
{	//Constructors can accept arguments, but this one does not
  processorspeed = 0; 
		//Initializes it to zero
}


Computer::~Computer()
{		//Destructors do not accept arguments
} 

//The destructor does not need to do anything.


void Computer::setspeed(int p) 
{       //To define a function outside put the name of the function 
	//after the return type and then two colons, and then the name 
	//of the function. 
  processorspeed = p;
}

int Computer::readspeed()  
{	//The two colons simply tell the compiler that the function is part
	//of the clas
  return processorspeed;
}

int main()
{
  Computer compute;  
	 //To create an 'instance' of the class, simply treat it like you 
  	 //would a structure.  (An instance is simply when you create an 
	 //actual object from the class, as opposed to having the definition 
	 //of the class)
  compute.setspeed(100); 
	 //To call functions in the class, you put the name of the instance,
  	 //a period, and then the function name.
  cout<<compute.readspeed();
	 //See above note.
  return 0;
}void Aclass::aFunction()
{
  cout<<"Whatever code";
}





#include <iostream.h>

class Computer //Standard way of defining the class
{
 public: 
	//This means that all of the functions below this(and any 
 	//variables) are accessible to the rest of the program.
 	//NOTE: That is a colon, NOT a semicolon...

Computer();
	//Constructor
 ~Computer();
	//Destructor
 void setspeed(int p);
 int readspeed();
		//These functions will be defined outside of the class
protected:
   //This means that all the variables under this, until a new type of
   //restriction is placed, will only be accessible to other functions
   //in the class.  NOTE: That is a colon, NOT a semicolon...
int processorspeed;
};		

   //Do Not forget the trailing semi-colon


Computer::Computer() 
{	//Constructors can accept arguments, but this one does not
  processorspeed = 0; 
		//Initializes it to zero
}


Computer::~Computer()
{		//Destructors do not accept arguments
} 

//The destructor does not need to do anything.


void Computer::setspeed(int p) 
{       //To define a function outside put the name of the function 
	//after the return type and then two colons, and then the name 
	//of the function. 
  processorspeed = p;
}

int Computer::readspeed()  
{	//The two colons simply tell the compiler that the function is part
	//of the clas
  return processorspeed;
}

int main()
{
  Computer compute;  
	 //To create an 'instance' of the class, simply treat it like you
  	 //would a structure.  (An instance is simply when you create an 
	 //actual object from the class, as opposed to having the  
	 //definition of the class)
  compute.setspeed(100); 
	 //To call functions in the class, you put the name of the
  	 //instance, a period, and then the function name.
  cout<<compute.readspeed();
	 //See above note.
  return 0;
}

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




לדף הראשון

<< לדף הקודם

לדף הבא >>