الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كائنات السي بلس بلس (مجموعة دروس)

مغلقرائج
بدأه Sultan_Althibity في 13 أكتوبر 2005 · 50 رد · 25,657 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#26

أختي مبرمجـة C++ :

الخطأ تصميمي في المثال الذي وضعتـه وليس الأمر قواعـدي ، بالنسبة لإجابتك أختي فلم أفهـم ما تقصدين ... الخطأ وكل ما فيـه هـو أن هذه دالة البناء قد تتحـول في بعض الحالات إلى دالة تحـويل من int إلى Fraction (الصنف الذي نقوم بكتابته) مما يعـني أن الأخطاء لن تكون في المترجم بل في المنطق وربما إذا تقدمنـا كثيراً في تطوير ذلك الصنف بنفس الطريقـة فستظهر أخطاء لن نستطيع معالجتهـا

أخي حسن الجـودي:

على العـموم سأكمل أنا ....

بالنسبة لتأخري في وضع الدرس السادس فهـو بسبب أن يوم الثلاثاء يوم مليء بالمحاضرات ....

#27

الدرس السادس:

حالة دراسية (حساب بنك)

هذا الدرس يعتبر درساً مهـماً للغاية ، والسبب في ذلك هـو حتى تفهـم المبادئ الأساسية التي ذكرناها في

الدروس الخمسـة السابقـة ، وأيضاً هـناك معلومات أخرى مهـمـة للغاية .....

كما قلت سابقاً فإننا سنتخلى عـن الصنف student والسبب في ذلك أخطاء تصميميـة كثيرة ارتكبتها أنا

متعـمداً لأغراض تعليميـة فقط ...

في هذا الدرس سنقوم بدراسـة كائن سنقوم بتصميميـه وإنشاءه من جـديد... إليك التحـديد العام للكائن الذي

نقوم بإنشاءه.....

لنفرض أنك تعـمل ضمن فريق يعـمل لإنشاء نظام بنكـي وقد قام رئيس الفريق بإسناد

مهـمـة إنشاء كائن الحساب البنكي إليك بالإضافـة إليك ، لم يطلب منك الكثير إلا أن المميز فيما طلبه منك

هـو أن تقوم بإنشاء عـداد يقوم بحساب الكائنات التي تُنشأ من هذا الصنف...

ملاحـظـة: ليس هذا ما يحدث لدى فريق مبرمجي ومصممي أي نظام ولكن نحن نتحدث هـنا عـن حالة

افتراضيـة لغرض التعلم فقط.....

عليك الآن أن تحدد نـوعـك من المبرمجين ... هل أنت صانع أصناف أم مستخدم أصناف .. كما هـو واضح

فأنت صانع أصناف .. وظيفتك أن تقوم بإنشاء صنف يستطيع مستخدمـه أن يقوم باستخدامـه بسهولة ودون

التفكير في قضية المعالجـة ....

فكّر الآن بكيفية تصميم هذا الصنف ، الحساب البنكي ، اسأل نفسك مما يتكون ... جميع ما سيحدث في هذا

الصنف هـو عـمليات مالية بالنقـود ... إيداع .. تحـويل .. وغيرها..

أحب أن أنبه هـنا إلى خطأ سيحدث فيه المبتدئيـن ، وهـو أنه الحساب البنكي سيقول أنه يتكون من عـميل

أيضاً ... الجواب هـو أن العـميل هـو من يتكون من حسابات بنكيـة وليس العـكس ... سنتحدث في الدروس

القادمـة عـن هذه العلاقـة بشكل أعـمق وأكثر ....

صنف الحساب البنكي يتكون بصفـة أساسيـة من المال المـودع ، والذي يزيد وينقص ويتحـول ويسحب ،

اتفقنا الآن على وجود عضو اسمـه المال المودع ، العـنصر الثاني هـو تاريخ إنشاء هذا الحساب ، قد تسأل فيما نحتـاج هذا المتغير؛ الجواب هـو حتى يستطيع البنك خصـم مال الزكاة تلقائياً كلما مر حول (أو سنـة) كاملة ،

العـنصر الثالث هـو تاريخ هذا اليوم ، حتى يستطيع البنك المقارنـة بينـه وبين تاريخ إنشاء الحساب ويتأكد

إن كان سيخصم مال الزكـاة أو لأ .... بما أن جميع هذه الأعضاء التي ذكرناها متغيرات فستكون مكبسلـة ،

أنظر إلى هذا الصنف:

1.	class Account 
2.	{
3.	double money;
4.	int DayOfBuilding; 
5.	int MonthOfBuilding;
6.	int yearOfBuilding;
7.	int Day;
8.	int Month;
9.	int Year;
10.	};

يتألف هذا الكائن من سبع متغيرات دفعـة واحدة بالرغـم من أننا اتفقنا على ثلاث أعضاء متغيرات فقط ...

اتفقنا على عـنصر تاريخ إنشاء الحساب ، هذا العـنصر يتكون من ثلاث عـناصر هي يوم إنشاء الحساب

وشهر إنشاء الحساب وسنـة إنشاء الحساب ، وكلها في الأسطر 4 و 5 و 6 ... والأمر نفسـه بالنسبـة

لعـنصر تاريخ اليوم ، لتطوير الصنف علينا أن نقوم بإنشاء كائن اسمـه التاريخ Date ، يتكون من ثلاث

متغيرات هي اليوم والشهر والسنـة ... عليك أيضاً أن تقوم بكتابـة واجهـة قويـة لهذا الصنف ..... أنظر إلى

هذا الصنف

class Date
{
public:
getDay( ) { return day;}
getMonth( ) { return month;}
getYear( ) { return year;}
void setDay(int a) { day=a;}
void setMonth(int a) { month=a;}
void setYear(int a) { year = a;}
private:
int day;
int month;
int year;
};

الآن أنظر إلى كائن الحساب البنكي ولكن هذه المرة بشكل أكثر سهـولة:

class Account
{
double money;
Date DateOfBuilding;
Date ThisDay;
};

الآن علينا كتابـة محددات الوصول لهذا الصنف حتى يستطيع التفاعل مع الأصناف الأخرى ، لاحظ أن هذه

المحددات ستختلف طبيعـة عـملها مع ما تعلمناه سابقاً ، والأمر يرجع إلى طريقة تفكير المصمم أو إلى طبيعـة

عضو الصنف الذي نحاول كتابة محددات وصول إليه:

class Account
{
public:
	getMoney() { return money;}
	double getDateOfBuilding(int a=1) {
  switch(a){
  	case 1: return DateOfBuilding.getDay();
  	case 2: return DateOfBuilding.getMonth();
  	case 3: return DateOfBuilding.getYear();
  	default: return 0;
    }
	}
	double getThisDay(int a=1) {
  switch(a){
  	case 1: return ThisDay.getDay();
  	case 2: return ThisDay.getMonth();
  	case 3: return ThisDay.getYear();
  	default: return 0;
  }
	}
	void setMoney(double m) { m=money;}
	void setDateOfBuilding(int a,int b,int c)
	{
  DateOfBuilding.setDay(a);
  DateOfBuilding.setMonth(b);
  DateOfBuilding.setYear(c);
	}
	void setThisDay(int a,int b,int c)
	{
  ThisDay.setDay(a);
  ThisDay.setMonth(b);
  ThisDay.setYear(c);
	}

private:
double money;
Date DateOfBuilding;
Date ThisDay;
};

ملاحـظـة: من الأفضل أن تقوم بكتابة تعريفات الدوال خارج الصنف وليس داخله.

قد تختلف معـي في كيفية استخدام محددات الوصول get و set ، الأمر يرجع في النهايـة إليك ، ولو أن الأمر

أصلاً لا يتم بهـذه الطريقـة ولكننا ذكرناها بسبب تقدم هذا الموضوع عـن دروسنا بأشواط..........

أنظر إلى واجهـة الصنف الذي قمنا بإنشاءه ولنركز الآن على كيفية تطوير الواجهـة وطريقة استخدامـه:

class Account
{
public:
	getMoney() { return money;}
	double getDateOfBuilding(int =1);
	double getThisDay(int =1);
	void setMoney(double m);
	void setDateOfBuilding(int a,int b,int c);
	void setThisDay(int a,int b,int c);

private:
      double money;
      Date DateOfBuilding;
      Date ThisDay;
};

ينقص هذا الصنف بعض الدوال المهـمـة للغاية ، أولى هذه الدوال دوال البناء والهـدم...

دعـنا نفكر في كيفيـة بناء هذا الصنف حينما يقوم مستخدم الصنف باستخدامـه ، الطريقة الأولى أن يقوم ببناءه

بدون أي قيم ، الطريقة الثانية هي أن يقوم ببناءه بقيمـة الحساب البنكي ، الطريقة الثالثة هي أن يقوم ببناءه بقيمة

الحساب البنكي وتاريخ إنشاء الحساب هـناك طريقة رابعـة لن ننظر إليها وسأتركها لك .............. هـناك

أيضاً دالة بناء خامسـة وهي دالة بناء النسخـة ، سأتركها لك أيضاً ، سنقوم الآن بكتابة تعريفات دوال البناء

الثلاث بالإضافة إلى دالة الهـدم ..........

Account() {}
Account(double a):money(a) {}
	Account(double a, Date b):money(a),DateOfBuilding(b){}
~Account() {}

لقد انتهينا الآن من دوال البناء ودالة الهـدم...

بقي لدينا الآن بعض الدوال الإضافية البسيطـة ، فالصنف الذي نقوم بكتابتـه غير قادر على التفاعل مع نظام

مصرفي بكامله ، لذلك علينا تطويره حتى يصبح قادراً على عـمليات الإيداع والتحـويل وغيرها .....

لعـملية الإيداع سنقوم بكتابة الدالة

AddMoney()

لعـملية التحويل سنقوم بكتابة الدالة

Chang( )

هـناك مشاكل ستظهر ، لا عليك سنقوم الآن بكتابة تعريفات هذه الدوال:

void AddMoney(double a){
  money+=a;}
void change(double a,Account& b){
  money-=a;
  double c=b.getMoney();
  c+=a;
  b.setMoney(c);
	}

لقد أصبح الآن الصنف Account يستطيع الإيداع والتحـويل ، الدالة AddMoney بسيطـة ولا تحتاج لشرح ،

الدالة chang تقوم باستقبال بارامترين اثنين ، الأول هـو كم المبلغ المراد تحويله والثاني هـو الحساب الذي

تريد التحـويل إليه، لن أشرح كيف ستقوم الدالة change بعـملها حتى لا نضيع الوقت في شرح خوارزميات

وطرق معالجـة.

هـناك مشكلـة ظهرت ، ماذا لو كان المبلغ الذي نريد تحـويله أكبر من مبلغ الحساب البنكي ، عليك الآن أن

تتأكـد من هذه المشكلـة أي أن المبلغ الموجود في الحساب أعلى من المبلغ المحـول كيف ستقوم بعـمل هذا

التأكـد ، من الخطأ أن تقوم بتضمين عـملية التأكد هذه ضمن الدالة change ، الدالة change وظيفتها هـي

تحـويل المال فقط ، ولا يهـمها التأكد أبداً ، لذلك من الضروري أن تقوم بتفويض هذه المهـمـة إلى دالة

أخرى ، وسنقوم بتسميتها ، سنقوم بتسمية هذه الدالة sureOfMoney :

bool sureOfMoney(double m)
	{
  if (m>money) return false;
  else return true;
	}

مهمـة التأكد من عـملية التحـويل سيقوم بكتابتها مستخدم الصنف وليس الصنف نفسـه ، أو ربما أن عـملية

التأكد ستتم ضمن صنف آخر وليس بالضرورة هذا الصنف

تعـديل محددات الوصول:

لقد أخطأنا في محددات الوصول أخطاءً كثيرة شنيعـة وينبغي لنا تعـديلها ، الدالتين get و set يجب أن تكون

في نفس النمط الذي قمنا به في الدروس السابقـة ، سنقوم الآن بتعـديل هاتين الدالتين تعـديلاً بسيطاً للغاية

وهـو الذي كان من المفروض أن يتم منذ أول ما قمنا بتطوير هذا الكـود ، وسبب وضعـي لتلك النماذج هـو

حتى أقول لك أن هذه هي طريقة محددات الوصول الصحيحـة مـهما كان شكل العـناصر الذي تستخدمـه ولو

كانت على شاكلة الصنف Date ، أنظر الآن إلى الصنف بكامله مضمنين فيه التغييرات

الجـديدة..................

>>> تابع بقية الدرس في الرد القادم

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

حاولت تعـديل التنسيق ولكن لا يرضـى .. لا أدري ما هي المشكلة رجاءي التعـديل

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 21 أكتوبر 2005 في 04:38

#28

الكـود وفيه التغييرات الجـديدة:

class Account
{
public:
	Account() {}
	Account(double a):money(a) {}
	Account(double a, Date b):money(a),DateOfBuilding(b){}
	bool sureOfMoney(double m)
	{
  if (m>money) return false;
  else return true;
	}
	void AddMoney(double a){
  money+=a;}
	void change(double a,Account& b){
  money-=a;
  double c=b.getMoney();
  c+=a;
  b.setMoney(c);
	}

	getMoney() { return money;}
	Date getDateOfBuilding( )const; //  حصل تغيير هـنا
	Date getThisDay( )const; // حصل تغيير هنا
	void setMoney(double m) { m=money;}
	void setDateOfBuilding(Date ); // حصل تغيير هنا
	void setThisDay(Date ); //  حصل تغيير هـنا
private:
       double money;
       Date DateOfBuilding;
       Date ThisDay;
};

أنظر الآن إلى تعريفات محددات الوصول الجـديدة والتي حصلت فيها التغييرات:

Date Account::getDateOfBuilding() const {return DateOfBuilding;}
Date Account::getThisDay() const { return ThisDay;}
/********************************************/
void Account::setDateOfBuilding(Date a) { DateOfBuilding=a;}
void Account::setThisDay(Date a) { ThisDay=a;}

بإمكانك الآن إضافـة دالة بناء النسخـة، في السابق قبل أن نقوم بكتابة محددات الوصول الجـديدة لم يكن بإمكانك كتابة دالة بناء النسخـة ، ولكن بعـد أن قمنا بكتابـة محددات الوصول بالشكل الصحيح أصبح بإمكانك كتابة دالة بناء النسخـة.....

هل انتهينا من تطوير هذا الصنف أم بقي هـناك القليل ... حسناً الصنف بهذا الشكل يحتاج للكثير حتى تقوم بتطويره ، سأترك لك هذه المهـمـة .... أما الآن فسنناقش ما كتبناه في بداية هذا الدرس حينما طلب منك رئيس الفريق أن تحدد له عـدد الكائنـات التي أُنشئت من صنفـك .. فكر في كيفية القيام بهذه الطريقـة...

هـناك طريقـة وهي أن تقوم بكتابة صنف آخر يراقب صنف الحساب البنكي ويحسب عـدد الكائنـات ، وهذه طريقـة خاطئـة بالطبع فكما قلنا في الدروس السابقـة ، فيجب عليك كتابة صنف مستقل عـن تغييرات العالم الخارجي بذاته ونفسه وقدراتـه ، الحل هـو أن تقوم بكتابة عـدّاد أو متغير يزيد كلما قمت بإستدعاء دالة البناء وينقص كلما قمت بإستدعاء دالة الهـدم ، قد تقول أنه ليس من الممكن فعل ذلك ، فهذا المتغير سيكون ملك للكائن ولن يحسب بقية الكائنات الأخرى ، حسناً الجواب هـو أن تقوم بكتابة متغير الذي يملكـه هـو الصنف وليس الكائن ، وهذه هي الأعضاء الساكنـة ..... في القسم الخاص من الصنف Account قم بإضافـة هذا المتغير:

static int count;

قم بتوفير محدد وصول له get في القسم العام ، على هذه الطريقـة:

static int getCount() { return count;}

الآن عليك إضافة دالتي البناء والهـدم ، أنظر:

Account () { count++; }
~Account () {count--;}

قم أيضاً بكتابة نفس الإجراء في دالة البناء في بقية دوال البناء الأخرى

بقي أن نشير هـنا إلى أن المتغيرات الساكنـة لا تخـزن في الـ stack بل في ذاكرة الـ heap في مثل المكان التي تخزن فيه المؤشرات ، إذاً عليك أن تقوم بعـملية تهيئـة لهذا المتغير الساكن count ، أنظر:

int Account::count = 0;

نقوم بكتابة هذا السطر خارج الصنف وليس داخلـه...

أنظر الآن إلى كيفية استخدام الصنف Account بشكله الجـديد في الدالة main :

int main()
{
	Account a[10];
	cout << Account::getCount() << endl;

	return 0;
 }

الخلاصـة:

لقد تعرفت على محددات الوصول وقمت بتأكيد معلوماتك حولها .. وأيضاً على بعض الأخطاء التي يقع فيها المبتدئون .. تعرفت أيضاً على المتغيرات والدوال الساكنـة .......

#29

مشاء الله على دروسك الحلوه

أرجو التقدم.....

تم تعديل هذه المشاركة بواسطة الممتاز في 19 أكتوبر 2005 في 08:32

#30

أعتذر عـن تأخري لمدة يومين في إضافة الدرس السابع ... أعـدكم بأني سأستمر في أقرب فرصـة ربما اليوم أو غـداً

#31

الله يعافيك يارب

#32

بارك الله فيك

اخي الفاضل لعظيم الفائدة استفدتها واكتسبتها من هذا الدرس

ربي لايحرمنا من اناس تعبوا وجهدوا في إيصال المعلومة

لنا

وإنارة دربنا على مايحبه الله ويرضاه

جزيت خيرا

وربي يرزقك ووالديك الجنة وتاكد تعبك لم يذهب هباء منثورا

جزيت خيرا

#33

لله درك يا أخي ..

ما عساها كلماتي تقول لتحكي عن هذ المجهود الأكثر من رائـــع ..

لكن ..

أؤثر الصمت.. و أوكل أمر شكرك لله ..

وأسال الله

أن يكلل ربي مساعيك بالنجاح ..

ويوفقك لما فيه رضاه ..

و يجعل كل ما أشكل عليك .. كالماء الزلال سهولة ووضوح ..

والله كنت في أشد الحاجة لهذه الدروس التي كنت كثيراً ماأبحث عنها

لكن ياأخي فضلاً لاأمراً أرجو أن تزيدني في شرح copy constructer (البانيات الناسخة) والفائدة منها

وجزاك الله خيراً...

#34

عندي سؤال مستغربته

يعني انتم تركزون بالشرح تكون الكلمات بالعربي زي قوالب وكائنات

انا ماعمري عرفتها غير بالانجليزي والتبس الشرح علي بالعربي

بس احسكم فاهمين صح .. والي مدرسينكم من قلب مو مثل جامعتنا ..!!

يمكن فئة الطلاب غير مادري بس احس التدريس له دور

#35

بسم الله الرحمن الرحيم

الدرس السابع

تابع بناء النسخـة مرة أخرى

معامل الإسناد

================

طلب البعض أن أقوم بتوضيح أكثر لمفهـوم دالة بناء النسخـة والفائدة منهـا....

حسناً الكل يعرف أن دالة البناء تُستدعـى عـند تهيئة المتغير ( أو الكائن) بقيمـة.....

أنظر إلى هذا الصنف:

class CLASS {
public:
CLASS()
CLASS (int)
CLASS (const CLASS&)
};

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

دعـنا الآن نفكر في كيفية تهيئة هذا الصنف، وقبل ذلك دعـنا ننظر إلى نمط البيانات double بشكل أكثر عـمقاً.. بإمكاننا تهيئة هذا النمط بإحدى هذه الطرق.

double A = 1;
int N=4;
double B= N;
double C

= A ;

في السطر الأول قمنا بتهيئـة المتغير A بقيمـة تبلغ قيمتها 1 ، السطر الأول شبيـه بهذا السطر بالنسبة للصنف CLASS :

CLASS A( 1 );

في السطر الثاني قمنا بتهيئة المتغير N من النمط int بالقيمـة 4 ، في السطر الثالث ، قمنا بتهيئـة المتغير B من النمط double بالمتغير (ليس قيمـة) N ، لو افترضنا أن النمط double عبارة عـن صنف فإن الأمر شبيه باستدعاء دالة بناء ، هـكذا:

double (int );

الآن دعــنا ننظر إلى السطر الرابع وهـو المهـم ، لقد قمنا بالتصريح عـن متغير من النـوع double واسمـه C ، وقمنا بتهيئتـه بالمتغير A ، لاحظ هـنا أن المتغير A و المتغير C من نفس النمط ، معـنى ذلك (لو افترضنا أن النمط double هـو صنف أو فئة) فأي دالة بناء سيقوم المتغير C باستدعائها ، قد تقول أن الدالة التي سنستدعيها هي ، هـكذا:

double (double);

وهذا الأمر خاطئ فلا يمكنـك تمرير كائن إلى دالة كائن آخر من نفس النمط ( وحاول تجريب ذلك وسيصدر المترجم خطأ) ، قد تقول الآن كيف ستنجح هذه التهيئة (وليس الإسناد ، هـناك فرق بين الإسناد والتهيئة وستعرف لماذا لاحقاً) الجواب هو انه مسمـوح لك تمرير عـنوان هذا الكائن إلى دالة كائن من نفس النـوع وليس الكائن نفسه ، وبالتالي فقد تقول أن الدالة التي سيستدعيها المتغير C من النـوع double ، هي هـكذا:

double( double& );

وكل ذلك صحيح ، ولكن إذا قمت بتمرير عـنوان المتغير A في السطر السابق ، ألن يكون هـناك خطر من أن تقوم دالة بناء المتغير C من تغيير قيمـة المتغير A ، ألن يكون من الأفضل لو تمنعها منعاً نهائياً من فعل ذلك ، لذلك قد تقوم بتعـديل شكل دالة البناء لتصبح هـكذا:

double (const double& );

لاحـظ معي في شكل هذه الدالة ، أليست هذه الدالة شبيهـه بدالة بناء النسخـة التي تعرضنا لها في دروس سابقـة ، من هـنا يجب عليك معرفة دالة بناء النسخـة وإلا فأعـد ما قرأتـه سابقاً...

دعـنا الآن نعـود إلى الصنف CLASS ، هـناك حالات كثيرة نستطيع فيها تهيئـة كائنـات هذا الصنف، أنظر إلى هذه الأسطر:

CLASS A= 1 /*   سيتم إستدعاء دالة البناء الثانية*/
CLASS B= A; //   سيتم استدعاء دالة البناء الآخيرة أي دالة بناء النسخة

جميع هذه العـمليات هي تهيئـة للكائنات وليست إسناد ، قد تسأل ما هـو الفرق بين الإسناد والتهيئة وإذا لم تكن الأسطر السابقة عـمليات إسنادية فما هـو الإسناد أصلاً....

دعـنا نفكر قليلاً ، أنظر إلى السطر الأخير من السطرين السابقين وهـو:

CLASS B= A;

حسناً ، بديهياً فإن الكائن B لم يكن موجوداً في البرنامج قبل هذا السطر ، حينما يصل البرنامج إلى السطر السابق ، فعليه أن يقوم بحجز ذاكرة كافية لاحتواء هذا الكائن الجـديد ، الكيفية التي سيقوم بها المترجم بحجز الذاكرة هي دالة البناء التي سيقوم السطر باستدعاءها وهي دالة بناء النسخـة....

الآن عليك أن تفهـم الإسناد ، حتى تفهـم الفرق بينه وبين التهيئة...

أنظر إلى هذه الأسطر:

CLASS A;
CLASS B=1;
A=B;

السطرين الأول والثاني مفهـومان ، لكن أنظر إلى السطر الثالث ، أريد أن أسألك هـنا أي دالة سيقوم المترجم باستدعاءها ، قد تقول أن المترجم سيقوم باستدعاء دالة بناء النسخـة ، الجواب هـو لأ ، لن يقوم المترجم باستدعاء دالة بناء النسخـة ، والسبب في ذلك هـو أن الكائن A قد تم حجز ذاكرة له في الأسطر السابقة ، ولن يحتاج إلى بناء ، هذا السطر هـو عـملية إسناد وليس تهيئة أو بناء ... كيف سيقوم المترجم بتنفيذ السطر السابق ، سيقوم هذا السطر باستدعاء دالة جديدة أخرى (يقوم المترجم بتزويدك بها في حال لم تقم بكتابتها) وهي دالة معامل الإسناد ، يعتبر هذا الكلام مقدمـة للفقرة القادمـة فاحرص على قراءتها جـيداً.

معامل الإسناد:

سنرجع الآن إلى مثال الصنف CLASS من الفقرة السابقـة ، وهذه المرة سنقوم بتزويده بدالة معامل الإسناد ، أنظر إلى هذا الصنف:

class CLASS{
CLASS();
CLASS(int);
CLASS(const CLASS&);
CLASS& operator=(const CLASS& );
int Num;
int Fra;
};

لقد قمنا بإضافة ثلاثة أشياء إلى مثال كائن الـ CLASS عـن الفقرة السابقة، في السطر الخامس قمنا بإضافة دالة معامل الإسناد ، وفي السطرين ما قبل السطر الأخير أضفنا متغيرين أعضاء ، لم نوفر لهـما محددات وصول وجعلناهـما في القسم العام ، والسبب هـو غرض تعليمي بالرغـم من أن هذا الإجراء يعتبر انتهاك لمبدأ الكبسلة...

سنقوم الآن بكتابة تعريف دالة البناء التي تستقبل بارامتر من النـوع int ، أنظر:

CLASS::CLASS(int a): Num(a) , Fra (a) { }

الآن عليك التفكير في حل للمشكلة الموجودة في آخر الفقرة السابقـة ، وهي توفير إجراء يقوم بعـملية الإسناد... بالطبع لن تتمكن دالة بناء النسخـة من القيام بهذا العـمل والسبب أن الكائن لن يكون في طور البناء أو التهيئة بل إنه الآن كائن كامل وموجود وله مكان في الذاكرة ويحتاج فقط للمساواة أو إسناد قيمة أحد المتغيرات إليه.

وسيلتنا إلى فعل ذلك هـو زيادة تحـميل معامل الإسناد ( = ) ، أنظر إلى السطر الخامس من الكود السابق تجـد أنـه يقوم بإعادة مرجعية أو إشارة إلى كائن من نفس النـوع (أي CLASS )، لاحظ أنه يستقبل أيضاً مرجعية كائن ثابتة كبارامتر ، أنظر إلى هذه الأسطر حتى تفهم بشكل أكثر:

CLASS A , B = 1;
A= B;

السطر الثاني ستتم ترجمتـه هـكذا:

A= A.operator = (&B);

أي سيتم استدعاء دالة معامل الإسناد للكائن A .

الخلاصة:

هذه مقدمـة عـن المعاملات وزيادة تحـميلها ، في الدروس القادمـة سنتعرف بشكل أعـمق على المعاملات وكيفية زيادة تحميلها ، ليس مطلوباً منك في هذا الدرس أن تعرف جميع مفاهيم التحميل الزائد للمعاملات ... بل عليك فقط أن تعرف الفرق بين معامل الإسناد ودالة بناء النسخـة... الدروس القادمـة ستعزز مثل هذه المفاهيم....

#36

على العـموم الدروس ستستمر سواءً رآها أحد أم لم يراها وشكراً

#37

Sultan_Althibity

مشكور وجزاك الله الف خير واستمر اخي في ابداعك بارك الله فيك

#38
Sultan_Althibity كتب:
على العـموم الدروس ستستمر سواءً رآها أحد أم لم يراها وشكراً

انا بايت هنا اما اشوف اخرتها معاك :D

ما شاء الله عليك

#39

أخ Asm4all:

قرأت ردك أمس وقلت لازم اليوم أكمل الدرس الثامن بس ... كتبت صفحتين وفجأة تذكرت إني نسيت مقاضي صغيرة للعيد كنت مأجلها لآخر ليلة ... وهأنا أذهب ولن تقابلوني إلا بعـد العيد بمشيئة الله ........

كل عـام وأنتم بخير

ومن العايدين

#40

حفظت الموضوع برمته على الهاردسك لقراءته لاحقاً .

وقبل أن تفكر في التوقف تذكر أن هذه الدروس يطلع عليها الأعضاء الحاليون و القادمون، فإن لم تلق شكراً من الحاليين فسوف يدعو لك القادمون .

جزاك الله خيراً .

أخي سوف تبكي عليك العيون * * * وتـسـأل عـنك دمـوع المـئـين

فإن جف دمعي سيبكي الغمام * * * يـرصـع قـبرك بــالـياسـمـيـن

أخـي مـا يـأسـنـا ولـن نيـأسـا * * * وما طال في القلب لبث الأسى

ومـا حـل أفــئــدة الــمــــؤمـن * * * سـوى أمـل في الـجنـان رسـى

أخي فانتظر ولتعش في غـد * * * سـيـنـبـثـق الأمـل الـسـرمـد

فـإن مـزقـتـنـا سني الــحـيـاة * * * فإنـا مع الـنصـر فـي مـوعــد

#41

كلام MSVS صحيح ..

انا ضعيف بالكائنات ...

حفظت دروسك لاطبقها في العطلة الطويلة :D ,,, حيث سأقوم بتطوير شوية برامج تعتمد اعتماد كلي على OOP ان شاء الله ..

عشان كذا ممكن تلقى سؤال هنا بعد 6 شهور :) ,,

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#42

سأستمر بهذه الدروس ولن أتوقف .. هذا التوقف مؤقت بسبب أن لدي اختبارات بعـد العيد في الجامعـة .. سأعـود

#43

جهد رااااااااااائع جداً أخي الكريم :rolleyes:

الله يجزيك الخير .......

بانتظار الجديد

Success Is A Journey Not A Destination

#44

السلام عليكم

إلى الأخ سلطان واضع الدروس

أولا أشكرك شكرا كثيرا على هدة الدروس الرائعة والتي قد طبعتها و أنا الآن أستعين بها في دراستي بالجامعة و لكن الشيئ المحزن أن هده الدروس ناقصة و لم تكتمل بعد فالرجاء منك اتمامها و إن لم تستطع فضعها في المرقفات لكي نستفيد منها و شكرا

#45

السلام عليكم ورحمة الله وبركاته

Sultan_Althibity كتب:
إخـوتي الأعـزاء ... لا أدري ولكني أحس أني أكتب وأضع هذه الدروس لنفسي

اخوي سلطان

اثابك الله

والله يا سلطان انك بردت على قلبي الله يبرد عليك في دنياك وآخرتك

احب اعلق على الإقتباس الي فوق مع انه جاء متاخر واقول

إلى الأمام ولا توقف وانا رح استناك عند الـ:

operator overloading

virtual classes and functions

abstract classes

and last but not least, templates

#47
	getMoney() { return money;}
	Date getDateOfBuilding( )const; //  حصل تغيير هـنا
	Date getThisDay( )const; // حصل تغيير هنا
	void setMoney(double m) { m=money;}
	void setDateOfBuilding(Date ); // حصل تغيير هنا
	void setThisDay(Date ); //  حصل تغيير هـنا

لم أفهم لماذا نستخدم const هل من الممكن التفصيل في هذه المسأله

void setMoney(double m) { m=money;}

بالنسبه لهذه الداله، أليس المفروض أن تكون:

void setMoney(double m) { money=m;}

جزاك الله خيرا ..

#48

السلام عليكم

للأسف أخي أنا مبتدأ مثلك لا أعلم الكثير عن السي++ و لدلك لابد للأخ سلطان أن يساعدنا .....أين أنت يا سلطان طال غيابك و الله .....الرجاء لمن يعرفه أن يخبره أننا في حاجة إليه و السسسسسسسسلام

#49

سلطان الناس عماله تقول سلطان سلطان

رد عليهم أنا جالي صداع

#50

جزاك الله خيرا .. منتظرين جديدك بفارغ الصبر ...

مع التحيه *

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…