AudaNix

8.2. الفئات وأعضاء الفئات

1 مشاركة في هذا الموضوع

الفئات وأعضاء الفئات Classes and class members

يوجد بـ سي++ عدد من انواع البيانات الاساسية مثل char و int و long و float الخ... وهي فى الغالب كافية لحل المشاكل البسيطة نسبيا، قد تجد صعوبة كبيرة فى حل المشاكل المعقدة بأستخدام هذة الانواع الاساسية. احدى امكانيات سي++ المفيدة هى امكانية تعريف انواع البيانات جديدة تتوافق بشكل ممتاز مع المشكلة التى تعمل عليها. قد تكون استخدمت نوعي enum , struct من قبل التى تمكنك من أنشاء انواع بيانات جديدة خاصة بك .

التالى مثال عن struct يحمل بيانات تاريخ:

struct DateStruct
{
int nMonth;
int nDay;
int nYear;
};

كلنا يعلم ان نوعي البيانات struct و enum من انواع البيانات التقليدية اى ليست من البرمجة كائنية التوجية OOP ويمكنها ان تحمل بيانات فقط. لو فكرت فى معالجة أو تحميلة بقية أبتدائية (initialize) تلك البيانات(نوع البيانات الجديد) فيجب عليك فعل ذلك مباشرا يدويا او ان تكتب دالة تأخذ DateStruct كوسيط لها.

// الاعلان عن متغير DateSturct
DateStruct sToday;

// تحميل المتغير بقيمة مبدئة يدويا
sToday.nMonth = 10;
sToday.nDay = 14;
sToday.nYear = 2020;

// او استخدام دالة اخرى لتحميل المتغير بالبيانات
void SetDate(DateStruct &sDate, int nMonth, int nDay, int Year)
{
sDate.nMonth = nMonth;
sDate.nDay = nDay;
sDate.nYear = nYear;
}

// تحميل نوع بيانات تاريخ الخاص بنا بالبيانات المناسية عن طريق الدالة setDate
SetDate(sToday, 10, 14, 2020);

فى علم البرمجة كائنية التوجية، فى الغالب انواع البيانات الخاصة بنا لا تحمل بيانات فقط بل تتضمن دوال ايضا التى تعمل على هذة البيانات. فى سي++ يمكن دمج البيانات مع الدوال فى نوع بيانات جديد خاص بك عن طريق الفئات class. باستخدام الكلمة الحاكمة class يمكنك تعريف نوع البيانات الخاص بك التى تسمي فئة a class .

الفئات Classes

فى سي++ ، الفئات تشبة كثيرا هيكل البيانات struct ، ما عدا ان الفئات تسمح لنا بالمزيد من المرونة وقوة نوع البيانات . فى الحقيقة ان كلاًً من هيكل البيانات والفئة التتاليين متطابقان بشكل كبير:

struct DateStruct
{
int nMonth;
int nDay;
int nYear;
};

class Date
{
public:
int m_nMonth;
int m_nDay;
int m_nYear;
};

لا حظ الفرق فقك فى الكلمة الحاكمة: public فى الفئة. سوف نناقش أهميتها فى الدرس التالى ان شاء الله.

تبدو الفئة كما لو كانت تعريف هيكل بيانات جديد، ان تعريف الفئة لا يحجز اى ذاكرة على الاطلاق. انه فقط يعرف شكل الفئة اي كيف تبدو الفئة. لكي تستخدم الفئة، يجب عليك الاعلان عن متغير من نوع الفئة الجديدة:

Date cToday; // الاعلان عن متغير من الفئة Date

// تعيين القيم الى اعضاء الفئة باستخدام معامل التحديد(.) النقطة.
cToday.m_nMonth = 10;
cToday.m_nDay = 14;
cToday.m_nYear = 2020;

فى سي++ عند الاعلان عن متغير من فئة ما يطلق على ذلك استنساخ نسخة جديدة من الفئة الاصلية instantiating . ان المتغير نفسة يسمى نسخة من الفئة. وان المتغير من نوع الفئة يسمى ايضاً كائن.

الدوال الاعضاء Member Functions

بالاضافة الى امكانية ان تحمل بيانات يمكن للفئات ايضا ان تحتوى على دوال! هنا فئتنا Date التى تحوى دالة لضبط التاريخ:

class Date
{
public:
int m_nMonth;
int m_nDay;
int m_nYear;

void SetDate(int nMonth, int nDay, int nYear)
{
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}
};

يمكنك الوصول الى الدوال الاعضاء فى الفئة عن طريف معامل المحدد النقطة(.) كما فى المتغيرات الاعضاء بهيكل البيانات العادية struct.

Date cToday;
cToday.SetDate(10, 14, 2020); // استدعاء SetDate() من داخل cToday

لاحظ فى نسخة هيكل البيانات الاصلية ان SetDate() كنا بحاجة الى تمرير هيكل البيانات نفسة كوسيط للدالة. وفى نفس الوقت فأن الدالة ﻻتعرف شئ عن هيكل البيانات المرر لها سوي عنوانة.

لكن فى النسخة SetDate() التى تستخدم الفئات class انت لست بحاجة الى تمرير cToday الى SetDate()! ﻻن SetDate() تسدعى cToday كما لو كان متغير عادي بداخلها، المتغيرات اﻻعضاء فى SetDate() سوف تشير الى المتغيرات اﻻعضاء بداخل cToday! بداخل الدالة SetDate() فأن m_nDay هى فلعليا يشير الى cToday.m_nDay . أن تم استدعاء cTomorrow.SetDate() فأن m_nDay بداخل SetDate() يشر الى cTomorrow.m_nDay .

يساعدنا أستخدام البادئة m_ للمتغيرات اﻻعضاء فى التفرقة بين المتغيرات اﻻعضاء من معاملات الدوال و المتغيرات المحلية بداخل الدوال اﻻعضاء. وهذا شئ مفيد للعديد من اﻻسباب:

اوﻻً: عندما نري تعيين قيمة لمتغير يبدأ بالبادئة m_ نعرف ان هناك تغيير فى خصائص(متغيرات) الفئة.

ثانيا: على عكس واسائط الدوال او المتغيرات المحلية المعلنة داخل الدالة فان المتغيرات اﻻعضاء يعلن عنها بداخل تعريف الفئة.

ومن ذلك نستنتج عند رؤية المتغير ذو البادئة m_ فأنه معلن بداخل تعريف الفئة وليس تعريف الدالة العضو فى الفئة.

وتذكر ان اسماء الفئات يجب ان تبدأ بحروف كبيرة.

التالي مثال اخر عن الفئات:

#include <iostream>
class Employee
{
public:
char m_strName[25];
int m_nID;
double m_dWage;

// Set the employee information
void SetInfo(char *strName, int nID, double dWage)
{
strncpy(m_strName, strName, 25);
m_nID = nID;
m_dWage = dWage;
}

// Print employee information to the screen
void Print()
{
using namespace std;
cout << "Name: " << m_strName << " Id: " <<
m_nID << " Wage: $" << m_dWage << endl;
}
};

int main()
{
// اﻻعلان عن متغيرين يمثلان موظفان
Employee cAlex;
cAlex.SetInfo("Alex", 1, 25.00);

Employee cJoe;
cJoe.SetInfo("Joe", 2, 22.25);

// طباعة بيانات الموظفان
cAlex.Print();
cJoe.Print();

return 0;
}

هذة هى مخرجات الكود السابق:

Name: Alex  Id: 1  Wage: $25
Name: Joe Id: 2 Wage: $22.25

تحذير: واحد من اﻻخطاء الشائعة فى سي++ هو نسيان أضافة الفاصلة المنقوطة فى نهاية كل فئة(وايضا هياكل البيانات) . مما يجعل المترجم يصدر اخطاء متعددة وكثيرة واحيانا اخطاء غير مترابطة.

وفى النهاية ﻻ يسعنى اﻻ ان اشكر الله الذي اعانني على ترجمة واعداد هذا الدرس اخوكم / محمد عودة

المصدر: الفئات والدوال الاعضاء Classes and class members

الدرس التالي: محددات الوصول العامة والخاصة

أذهب الي:المقدمة والفهرس الرئيس

الدرس السابق: الفئات والدوال الاعضاء

تم تعديل بواسطه محمد عودة
تنسيقات لتحسين العرض
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .