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

سؤال عن الإجراءات المتقدمة

بدأه أبو فهيد في 26 فبراير 2008 · 3 رد · 707 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أخواني أنا عندي كتاب علم نفسك C++ في 21 يوم ولي شهرين ما قضيت الكتاب :lol:

عل كلي وصل إلى فصل الإجرءات المتقدمة وكان فيها إعادة الوصف ووو

المهم وصل فيها إلى كود إعادة تعين معامل السابق واللاحق في الصنف والحقيقة ما أقنعني السيد جيسي ليبرتي (مؤلف الكتاب) وأريدكم تقنعوني

هذا هو الكود

// Listing 10.12
// Returning the dereferenced this pointer

#include <iostream.h>

class Counter
{
public:
	Counter();
	~Counter(){}
	int GetItsVal()const { return itsVal; }
	void SetItsVal(int x) {itsVal = x; }
	const Counter& operator++ ();	  // prefix
	const Counter operator++ (int); // postfix

private:
	int itsVal;
};

Counter::Counter():
itsVal(0)
{}

const Counter& Counter::operator++()
{
	++itsVal;
	return *this;
}

const Counter Counter::operator++(int x)
{
	Counter temp(*this);
	++itsVal;
	return temp;
}

int main()
{
	Counter i;
	cout << "The value of i is " << i.GetItsVal() << endl;
	i++;
	cout << "The value of i is " << i.GetItsVal() << endl;
	++i;
	cout << "The value of i is " << i.GetItsVal() << endl;
	Counter a = ++i;
	cout << "The value of a: " << a.GetItsVal();
	cout << " and i: " << i.GetItsVal() << endl;
	a = i++;
	cout << "The value of a: " << a.GetItsVal();
	cout << " and i: " << i.GetItsVal() << endl;
	return 0;
}

السؤال وشلون قدر المعالج يعرف أيهن السابق واللاحق طبعا تبي تقلولي بإضافة وسيط ل Operator ولكن أحتاج إلى شرح أكثر

إضافتا إلى أن كود معامل اللاحق ما أقتنعت فيه

const Counter Counter::operator++(int x)
{
	Counter temp(*this);
	++itsVal;
	return temp;
}

وش اللي تغير هذا الكود هو نفسه حق السابق لأنه سوف يزيد رقم للمتغير ثم إرجاعه !!

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

تحيااااااتي,,,

للصداقة البرمجية

pro-vb6@hotmail.com

#2
اقتباس
أخواني أنا عندي كتاب علم نفسك C++ في 21 يوم ولي شهرين ما قضيت الكتاب

ماشاء الله عليك تتقدم بشكل جيد ، أنا أعتقد أني أنهيته في فتره أطول بكثير :) ،

اقتباس
السؤال وشلون قدر المعالج يعرف أيهن السابق واللاحق طبعا تبي تقلولي بإضافة وسيط ل Operator ولكن أحتاج إلى شرح أكثر

سؤال وجيه ، وسأكتب ما أعرفه ، وربما يعرف أحد الشباب معلومات أكثر ويفيدنا أكثر ..

المهم ، المعامل ++ ، عندما نتعامل معه نقوم بكتابه المعامل ومن ثم الكائن وبالتالي سوف يستدعي داله ++ . جميل وهو ما يحدث هي Prefix .

الان أريد أن أعمل داله أخرى لPostFix ، لن أستطيع أن أكتب

const Counter operator++ (); // postfix
const Counter& operator++ ();	  // prefix

وذلك لأنه سوف تكون هناك دالتين بنفس الأسم ، وهنا الحل جاء بوضع أي علامه تفرق بينهم ، وهنا تم الأستفاده من خاصيه في سي++ وهي عمل داله تستقبل نوع بيانات معين ولكن من غير تحديد اسم له . وهكذا أصبحنا نفرق بينهم .

const Counter& operator++ ();	  // prefix
	const Counter operator++ (int); // postfix

الان كيف يعرف المترجم ، ربما هناك شيء ما في مترجمات سي++ تعرف أن في حال تم استدعاء :

x++;

سوف تذهب الى الداله التي بها هذا الMark .

جرب واجعل هذه الداله تعمل postfix:

const Counter& operator++ ();	// postfix

واستدعي الكائن ب :

x++;

وسوف تلاحظ أن المترجم أعطاك رساله خطأ تنبه ألى أنه يجب أن تضع Mark على الداله حتى تفرق بين prefix و postfix .

وفي المترجمات القديمه مثل trbou c++ سوف تمشى هذا الأمر ، ولن تخرج لك الا رساله warring على ما أذكر .

أعلم أنه الجواب غير دقيق ، ولكن هذا اللى أعرفه ، وسوف أبحث أكثر في الموضوع ..

وش اللي تغير هذا الكود هو نفسه حق السابق لأنه سوف يزيد رقم للمتغير ثم إرجاعه !!

الذي تغير هو أنه تم أولا حفظ قيمه الكائن الحالي *this في كائن مؤقت ، ومن ثم زياده قيمه الكائن الحالي بواحد ، بعدها تم ارجاع الكائن المؤقت (هنا في الكائن المؤقت القيمه itsVal لم تتغير ) ,

الأن عندما يتم ارجاع قيمه الكائن المؤقت ستكون ما قبل عمليه الزياده ، ولكن في نفس الوقت تمت عمليه زياده قيمه itsVal في الكائن الحالي ،

x = y++;

ستتم ارجاع قيمه الكائن المؤقت الذي يساوي الكائن الحالي y .. وفي نفس اللحظه الكائن y (القيمه الحاليه له) تم زيادتها بواحد .

وهكذا نكون طبقنا مفهوم Prefix.

تحياتي . -_-

تم تعديل هذه المشاركة بواسطة romansy في 26 فبراير 2008 في 19:01

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

تفضل أخي أبوفهيد :

هنا يشرح لك الأمر ، ببعض الأمثله :

Overloading increment and decrement operators

وهنا ، لماذا يجب عليك أن تفضل PreFix دائما .

Prefer prefix operators over postfix

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4

الف شكر لك أخي رومانسي

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

وأسف على تأخري بالرد لأن الإنترنت إنقطع

يعطيك العافية

تحيااااتي

للصداقة البرمجية

pro-vb6@hotmail.com

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