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

شرح لل Class

رائج
بدأه شعاع الأمل في 18 مارس 2008 · 52 رد · 31,204 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#26

هلا فيك رغد.........

لا مو حل واجب :( بس أنا وقفت عند هذي الفقرتين لأني من الأساس مافهمت فكرتها او المقصود بالقلوبال......

أنا في انتظارك على أحر من الجمررر........

#27

بخصوص الفقرة رقم 1:

اهلين اختي..مفهوم او فكرة Global تحديداً بلغة ++C هي ذالك المجال The Scope او تقدري تسميه نطاق مرئيي Visible او معروف لعموم اجزاء البرنامج. مثل شو بالضبط؟ تابعي معي التالي علشان تعرفي شو يعني Scope نطاق وشو يعني Global عام وشو يعني Local محلّي.

,..,.,.,.,.,,.,.,.,.,.

كل جزء من الشيفرة معرّف خارج الأصناف Classes أو خارج أي دالة Function يعتبر معروف ومرئي على مستوى نطاق الملف ويسموا هذا النطاق هو File Scope وهو كمان Global Scope و أي شيء معرّف (مثل المتغيرات) داخل دالة معينة فهي على مستوى النطاق المحلّي Local Scope لهذه الدالة فقط. و أي شيء معرّف داخل Class فهو يعتبر مرئي على مستوى نطاق الصنف Class Scope..لاتهتمي لفكرة Public and Private.. على سبيل المثال من برنامجك السابق..لاحظي الدالة val_choice(...)معرّفة ومخصصة داخل نطاق الصنف حتى لو كنا نقدر نستعملها خارج الصنف بطريقة ما و لكنها في الحقيقة Member Function أي أنها متعلقة بهذا الصنف وموجودة على مستوى نطاق الصنف Class Scope. طيب!! علشان نخلي هذي الدالة في النطاق العام Global Scope لازم نفصل علاقتا بالمرة مع الصنف تبعها..ونعلنها ونعرفها مرة تانية في ذلك النطاق العام..يعني خارج أي صنف وخارج أي دالة(طبعاً ممنوع بلغة ++C تعريف وإنشاء دالة داخل دالة) ولكن لترسيخ المفهوم.

.,,..,,..,,.,..,,..,..,,.

خلص الآن انشيء الدالة val_choice خارج الصنف ومرري مرجع Reference لكائن من الصنف المطلوب. رح يكون التصميم المبدئي للدالة هذي كالتالي:

LEFT TO RIGHT

int val_choice(Shape& sh, int x);

خلص الآن تنشيء باقي الخوارزمية المتعلقة بالدالة(طبعاً ماني شايفة منطق خوارزمي مناسب لاستعمال مرجع داخل الدالة تبعتك) ايضاً على مستوى الملف نفسه ولو كنتي رايدة ترجعي لأي شي متعلق بالكائن الممرر بواسطة المرجع (sh في هذي الحالة) استعملي نقطة الوصل The Access Operator داخل الدالة كالتالي:

على سبيل المثال طبعاً

LEFT TO RIGHT

sh.someMemberFunction(param);

//or

sh.someDataMember = value;

---------

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

هذا بخصوص الفقرة الأولى يا ريت حدا يساعدني بالفقرة التانية..وآسفة على التقصير..باختصار الفقرة التانية نفس الفقرة الأولى في مكان ووضع الدالة Menu أما الخوارزمية تبعتا عليك انتي اختي لأنك شايفة البرنامج اكتر مني :happy:

--------

المقصود بالخوارزمية هنا: خطوات حل المشكلة البرمجية وعمل خطوات آداء الدالة الخاصة بالبرنامج وآداء وظيفتا.

----------

اطيب المُنى

تم تعديل هذه المشاركة بواسطة رغـــــــــد في 4 مايو 2008 في 21:36

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#28

هلا فيك اختي رغد.......

كيف يعني أعرفها خارج الصنف؟؟قصدك يعني خارج الكلاس؟؟!!يعني أعرفها بأي ملف؟؟

أعرفها فوق #include :(

أنا فهمت الغايه ومفهوم ال global إنه أعرف فيه أشياء راح تشمل كل البرنامج وكل الملفات ومايحتاج أعرفها من جديد صح :resentful: ؟؟

معليش أختي رغد اصبري علي :blush: أنا مبتدئه بس والله اني ادعيلك بظهر الغيب :yes: ..

#29
شعاع الأمل كتب:
هلا فيك اختي رغد.......

كيف يعني أعرفها خارج الصنف؟؟قصدك يعني خارج الكلاس؟؟!!يعني أعرفها بأي ملف؟؟

أعرفها فوق #include :(

أنا فهمت الغايه ومفهوم ال global إنه أعرف فيه أشياء راح تشمل كل البرنامج وكل الملفات ومايحتاج أعرفها من جديد صح :resentful: ؟؟

معليش أختي رغد اصبري علي :blush: أنا مبتدئه بس والله اني ادعيلك بظهر الغيب :yes: ..

بعنية اختي بساعدك والله :happy:

.,,.,,.,.,,.,.,.,.,.,.,.,.

اقتباس
كيف يعني أعرفها خارج الصنف؟؟قصدك يعني خارج الكلاس؟؟!!يعني أعرفها بأي ملف؟؟

بالضبط احذفي الدالة من داخل الكلاس وأنشيئها وعرفيها بشكل عادي بالملف رقم ثلاثة تحت اي كل التضمينات والإستعملات #include and using... مباشرة..عادي مثل الدوال العادية لما بتنشئيها بالدروس الإبتدائية مافي فرق.

وانا جالسة معاك شوي لحدة ما..ماني طالعة الآن

,,.,.,.....,.,,.,.,.,.,.,.,.,.

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#30

طلعتي :(

؟

بخصوص الشق هذا من السؤال ناسية جوبك عليه

اقتباس
أنا فهمت الغايه ومفهوم ال global إنه أعرف فيه أشياء راح تشمل كل البرنامج وكل الملفات ومايحتاج أعرفها من جديد صح 041.gif ؟؟

بالضبط هذا مفهوم Global Scope..

,.,.,.,.,.,.,.,.,.,.

أطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#31

أختي رغد أنا أطل بين ساعه وساعه لأاني مشغوله........

أنا معك تفضلي.........

#32

خلص جوبتك على آخر اسئلة!!

,.,.,.,.,.,.,.,.,.

أنا كنت فاكرة عندك اسئلة اخرى متعلقة بالموضوع فكنت رايدة ننقاشها بالمرة بنفس الوقت..لأني كنت جالسة اشرب عصير عنب وآكل شبس..الآن تفشانة ومني رايدة احكي مع حدا(بمزح) :happy:

,.,.,.,.,.,.,.,.,.

اطيب المُنى

تم تعديل هذه المشاركة بواسطة رغـــــــــد في 5 مايو 2008 في 06:05

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#33

هههههههههههههههههههه

بالعافيه أختي رغد وإن شاء الله تروقين وترجعين لنا:)

تم تعديل هذه المشاركة بواسطة شعاع الأمل في 5 مايو 2008 في 17:12

#34

هلأ شاربة عصير عنب ومعاه شبس كمان :happy:

,.,.,.,.,.,.,.,.,.,.

تابعي اختي البرنامج التالي :happy: : عبارة عن برنامج هيكلي بسيط موثق بالتعليقات Comment (كاتبتهن بالعربي) توضح أماكن تلك المجالات The Scopes اللي المشروحة بالردود السابقة:

,.,.,.,.,.,,.,.,.

ديري بالك التلمحيات محبرتهن باللون الأخضر يعني حتى لو شفتيه رايح للسطر التاني فهو ضمن التلميح(التعليق)

LEFT TO RIGHT

#include <iostream>

using namespace std;

// نموذجياً وبعد تضمين كل ما يلزم من ملفات نحتاجها بالبرنامج نقوم بتعريف اجزاء البرنامج

/*

هذي المنطقة نزولاً لتحت..وأي منطقة

بيضاء تشوفيها تحديداً خارج اي دالة او كلاس وقبل الإجراء الرئيسي

main تُعتبر النطاق العام Global Scope وكمان في

نفس الوقت هو File Scope

*/

class MyClass

{

// كل شيء مكتوب داخل الكلاس يعتبر في مجال هذا الكلاس Class Scope

// حتى لو كان داخل قسم الخاص او العام او المحمي

private:

//لا يهمنا لو كانوا خاصين او عامين

int somePrivateVar; //هذا المتغير مثلاً في مجال Class Scope

void somePrivateF();

public:

//كمان هدول يعتبروا Class Scope.

int somePubplicVar;

// الوسيط x هنا بيدخل ضمن Local Scope و غير معروف لكل البرنامج إلا بس هذي الدالة

int somePublicF(int x);

protected:

//نفس الشيء ينطبق على هدول

int someProtectedVar;

//الوسطين x و y هنا في مجال Local Scope وليست معروفة إلا بس للدالة هذي

double somePrivateF(double x, double y);//ديري بالك مش نفس x السابق ولا يعرفوا بعض حتى

end};

/*

نحنا الآن خارج اي كلاس وأي دالة وقبل الدالة الرئيسية

إذاً نحنا بالمجال العام كمان Global Scope

*/

*/ الدالة التالية هي نفسا الدالة التابعة للكلاس السابق ولكن هذا التعريف

لا يعني أنها Global و لكن فقط معرّفة خارج الكلاس

يعني ممكن تعملي التعريف هذا داخل الكلاس

*/

int Myclass::somePublicF(int x)

{

// هذي المنطقة هي Local Scope للدالة هذي بس

end}

/*

نحنا الآن خارج اي كلاس وأي دالة وقبل الدالة الرئيسية

إذاً نحنا بالمجال العام كمان Global Scope

يعني الدوال التالية مُعلنة ومُعرّفة مبدئياً داخل النطاق العام

*/

void globalFunction1();// هذا

int globalFunction2(int x);// و هذا كمان

double someGlobalVar;// و هذا كمان

/*

حتى الإجراء main موجود بالنطاق العام Global Scope.

*/

int main()

{

// كل شيء دخل وبين القوسين المجعدين بالدالة يسمى النطاق المحلّي Local Scope

MyClass obj(); // هذا معروف هنا بس بالـ نطاق محلَي

int localVar = 0;//و هذا كمان

return 0;

}

// هنا تكملة لتعريف الدوال السابقة اللي معرّفة مبدئياً بالنطاق العام Global Scope

void globalFunction1()

{

//نطاق محلّي لهذي الدالة بس

MyClass obj(); // لاحظي الكائن obj هنا مش السابق الموجود بالدالة الرئيسية

int z = 20;// ايضاً المتغير z هنا بالنطاق المحلّي الخاص بهذي الدالة فقط

}

int globalFunction2(int x)

{

//نفس الفكرة السابقة بالدالة السابقة بالضبط

int z = x * 2;// المتغير z مش المتغير الموجود بالدالة السابقة ولا يعرفوا بعض حتى

return z;

}

بإيجاز طالما نحنا مش موجودين بين الأقواس المجعدة وعلى مستوى الملف نفسه إذاً نحنا بالمجال العام Global Scope. و طالما نحنا بين الأقواس المجعدين مباشرة داخل كلاس إذاً نحنا على مستوى الكلاس Class Scope. و طالما نحنا بين الأقواس المجعدين ولكن داخل دالة معينة إذاً نحنا بالنطاق المحلّي The Local Scope الخاص بهذي الدالة. وكل شيء معروف و معمم داخل النطاق الخاص به فقط عدا تلك الأشاء المعرّفة مثل المتغيرات الموجودة بالنطاق العام على مستوى الملف فهي مرئية و معروفة لدى الدوال مثل التالي:

LEFT TO RIGHT

int GlobalScopeVar = 10;

void printSomething()

{

cout << GlobalScopeVar << endl;// رح يطبع عشرة لأنه عارف شو قاصدين من اسم المتغير

}

آسفة على التقصير والـتأخير اختي شعاع

ملاحظة: كاتبة بنهاية الكلاس والدالة كلمة end بس علشان تمسك السطر لأنه ما صلح معي أثناء التحرير.

,.,.,.,.,.,.,.

اطيب المُنى

تم تعديل هذه المشاركة بواسطة رغـــــــــد في 7 مايو 2008 في 11:33

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#35

أختي الغاليه رغد....

والله ما أدري كيف أشكررررك الحين فكره وضحت أكثر:)

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

معليش طولت عليك بس اعتبريني طالبه أو أختك الصغيره.......

شاكره لك من كل قلبي.......

ربي يحغظك........

#36

العفو اختي وبحفظك الله من كل سوء ومكروه انتي كمان :happy:

,.,.,.,.,.,.,.,.,.

طيب شوفي البرنامج التالي بسيط ومش معقد وتأمليه واقرأي التلمحيات تبعته:

#include <iostream>
using namespace std;

int x = 10;// متغير معرّف بالمجال العام

int main()
{
    int x = 20;//متغير بالمجال المحلّي بنفس اسم المتغير اللي بالمجال العام
    cout << x << endl;// اش راح يطبع على الشاشة 10 أو 20؟ أي إكس فيهم؟
    return 0;
}

البرنامج او سطر الطباعة بالتحديد راح يطبع قمية ويعتبر أي x فيهم؟ اللي معلنة بالمجال العام أو اللي مُعلنة بالمجال الخاص التانية اللي داخل الدالة الرئيسية main؟

---------

طبعاً بمجرد ما تنفذي البرنامج رايحة تعرفي ولكن انا رايدة تخمني (تتوقعي) الإجابة اول شيء (يعني تعملي تقييم ذاتي). ولو كان الناتج هو قمية x العامة كيف بكون قادرة على طباعة الـ x المحلية؟ و كيف العكس كمان؟

ملاحظة: لحدا يجاوب غير الأخت شعاع..السؤال مخصص لها فقط. :happy:

,.,.,.,.,.,.,.

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#37

اممممممممممم

أتوقع راح يطبع ال20 لأنه متعرفه بالمحلي ولو أنها مو متعرفه راح يستدعي المجال العام...

أنا فهمتها كذا ووالله ماجربت جالسه أجاول على فهمي وإن شاء الله يكون صح....

#38

ممتازة اختي شعاع

,.,.,.,.,.,.,.,.

طيب عارفة اش اسم العملية هذي اللي صارت؟ هذي عملية تغطية(سِتر)..دايماً المتغيرات المحليّة اللي لها نفس إسم المتغيرات العامة بتغطي عليهن..بالضبط مثل مصار معنا بالبرنامج السابق x المعرّفة داخل الدالة الرئيسية غطت على x المعرّفة بالنطاق العام The Global Scope..فقام الكائن cout المسؤول عن الإخراج بطباعة قيمتها على الشاشة وهي 20 في هذا المثال.

,.,.,.,.,.,.,.,.,.

طيب تابعي البرنامج التالي:

LEFT TO RIGHT

#include <iostream>

using namespace std;

int x = 10;

int main()

{

int x = 20;

{

int
x
= 30;
//هذي اللي رايحة تُطبع على الشاشة

cout <<
x
<< endl;
// بكل بساطة رح يطبع 30 لأنها سترت كل السابق
ة

}

return 0;

}

البرنامج واضح؟ عارفة لش لأن كل شيء داخل الأقواس المجعدين هم داخل نطاق محلّي أعمق من اللي قبله علشان كذا الكائن cout احترم المتغير x الموجودة والأقرب له بالنطاق اللي هو موجود فيه.

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

,.,..,.,.,.,.,.,.,.,.,

طيب لش ما جوبتي على باقي السؤال :happy:؟

لو انا رايدة من البرنامج السابق(الواجب) طباعة قيمة المتغير x الموجود بالعام مش اللي جواة الدالة الرئيسية..شو رايحة اعمل؟ هل هناك حل؟ لهذي العملية؟ لاختصار وقتك رايحة جاوبك عليها انا.

.,.,.,,.,.,.,..,,.,.,.,.

بلغة ++C هناك معامل Operator خاص بالمجال اسمه Scope Resolution Operator وشكله هيك (::).

بنستعمله للوصول إلى مجال Scope معين مثل مجال حيّز اسمي Namespace واكيد مؤلوف بالنسبة إلك كالتالي:

LEFT TO RIGHT
std::cout << "print something" << std::endl;

أو للوصول إلى دالة او خاصية موجودة بكلاس معين

LEFT TO RIGHT
void MyClass::doFunction()...etc

LEFT TO RIGHT
MyClass::dataMember = something;

أو مع المعددات (ماني عارفة ترجمتها تحديداً) enum وتذكري كمان شو؟ :happy:

,.,.,.,.,.,.,.,,.

بخصوص حل البرنامج (الواجب) كالتالي:

LEFT TO RIGHT

#include <iostream>

using namespace std;

int x = 10;

int main()

{

int x = 20;

cout << x << endl;
//20;

//شوفي الحل كالتالي:

cout <<
::
x << endl;
//راح يطبع قيمة اللي بالعام احترام للمعامل اللي كتبناه

return 0;

}

,.,.,.,.,.,.,.,..,.,

مرة تانية كل البرامج اللي انا كاتبتها هنا ليست نموذجية ولكن جيدة لتوصيل بعض المفاهيم المتعلقة بالمجال المحلّي والمجال العام والمعامل الخاص بالمجالات(كاتبتا مجلات اول, لأني حاطة عيني عليهن ..شاريتهن من يومين وما قريتهن :happy:)

,.,.,.,.,.,.,.,.,.,.,.

اطيب المُنى

تم تعديل هذه المشاركة بواسطة رغـــــــــد في 9 مايو 2008 في 10:52

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#39

أختي رغد معليش ما انتبهت للسؤال اعذريني...

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

يعطيك ألف عافيه أختي رغد بس عندي سؤال...

أبي أفهم الفرق بين pass_by_value و pass_by_refrence

لأنه صراحه الأستاذه شرحت ولي يومين أذاكر وأوقف عندها...

معليش تحمليني...

#40

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

,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.

لا اختي على عيني بساعدك..لش أنا موجودة بالمنتدى إذاً؟ بس سامحيني بالتأخير و أسألي عادي.. لأن أوقات الصباح بكّير افضل شيء لي هذي الإيام بالذات. :happy:

,.,.,.,.,.,.,.,.,.,.,.,..,.,,

طيب انتي رايدة الفرق بيناتهن لكن عارفة اساسيتهن؟ (هيك متوقعة). على الأقل بأن reference لأي كائن هو مجرد عنوانه الحقيقي بالذاكرة بالكمبيوتر.

.,.,.,.,.,.,.,.,.,.,.,.,.,.

الفرق هو في (السرعة) و جوهر الإجابة هو في كلمة (متى) نستخدم أو نعمل هذي التقنية ونتجاهل الأخرى. تابعي:

أولاً في لغة C++ يسموا التمرير بواسطة المؤشر Pointer او بواسطة المرجِع Reference يسموهن تمرير بواسطة المرجع يعني Passing By Reference ومش مقتصرة الكلمة على Reference بس حتى المؤشرات Pointers كمان. يعني التالي يُدرَج تحت مصطلح التمرير بواسطة المرجع Passing by reference:

LEFT TO RIGHT

double func1(double *d);//لاحظي هنا مؤشر

//or

double func2(double &d);//لاحظي هنا مرجع

اوكي؟ لاحظي بأن المُمرر بالدالة الأولى هو مؤشر pointer والتانية هو مرجِع Reference وكلهن يندرجوا تحت مسمى Passing by reference.

,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.

أما بخصوص التمرير بواسطة القيمة passing by value هي نفس التمرير المعتاد اللي بتعمليه بأبسط برنامج كالتالي:

LEFT TO RIGHT
double func1(double d);

طيب انتي عارفة بأن الكائنات objects لها احجام مختلفة بالذاكرة, منها ماهو Byte و اتنين بايت او تلاتة او ....حتى اكتر بكتير..ولما بنجي نمرر كائن كبير لدالة راح ياخذ وقت من البرنامج اكتر من كائن زغير حجمة يدوب اربعة بايت او تمانية مثل int أو double. لهذا السبب التمرير بواسطة المرجع By reference افضل عند تمرير كائنات كبيرة مثل الكلاسات اللي بيعملوها واللي بنعملها نحنا كمان بتكون اكبر من الأنواع الأساسية المعروفة بكتير.. علشان نضمن سرعة البرنامج واللي هو متطلب هندسي وبرمجي نسعى إليه. باقي هناك ضروف تانية يُستحسن فيها التمرير بواسطة المرجع.تابعي... لا تهتمي للفروق ومتى و أين..رايدة الخصهن بنهاية الرد...

.,.,.,.,.,.,.,.,.,.,,..,,..,,.

طيب..لما بنعمل تمرير بواسطة Reference و نعمل تغير او تعديل على هذا الكائن الممرر بواسطة هذي التقنية راح يتأثر الكائن الأصلي اللي ممرناه مسبقاً..خذي برنامج علشان الوضوح:

LEFT TO RIGHT
#include <iostream>

using namespace std;

//:":":":":":":":":":":":"

void passByVal(int x);

void passByRef(int &x);

int main()

{

int var = 0;

cout << var << endl;// 0

passByVal(var);

cout << var << endl; // 0

passByRef(var);

cout << var << endl; // 10;

return 0;

}

void passByVal(int x)

{

x = 50;

}

void passByRef(int &x)

{

x = 10;

}

لاحظي لما مررنا المتغير var بواسطة تقنية By Value بالدالة passByVal وقمنا بطباعة قيمتها..كما هي 0 بالرغم اننا عملنا تغيير لـ x داخل الدالة, ولكن لم يؤثر هذا التغيير على المتغير var المُمَرر إلى الدالة..عارفة لش؟ لأننا مررنا نسخة Copy من قيمة المتغير var ومش المتغير var نفسه.

,.,.,.,.,.,.,.,.,.

لكن لاحظي لما مررنا المتغير var بواسطة تقنية By Reference بالدالة المخصصة لذلك passByRef وقمنا بطباعة المتغير var بعدها..صار معنا 10....عارفة لش؟ لأننا مررنا العنوان الحقيقي له في الذاكرة إلى الدالة وليس نسخة copy من قيمته بس..يعني x اللي جواة الدالة هي عبارة عن مرجِع(عنوان تقدري تعتبريه مؤشر ايضاً) للمتغير var الحقيقي في الذاكرة و مش نسخة Copy من قيمته.

,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,..,.,.,,.

طيب بعض الأحيان بكون رايدة امرر كائن كبير للدالة و لكن في نفس الوقت رايدة احميه من أي تغير لقيمته داخل الدالة مثل مصار مع المتغير var السابق..شو فاكرة رايحة اعمل؟ هناك تقنية اسمه تمرير بواسطة مرجع ثابت By Constant Reference. بيسمح لنا التمرير بواسطة عناوين الذاكرة للكائنات الضخمة بالضبط مثل المثال السابق في التمرير بواسطة المرجع ولكن(ديري بالك من كلمة ولكن) بدون ما نقدر نغيير بقيمة باستخدام المعامل (=)... بمعنى آخر بنستفيد منه داخل الدالة بدون ما نأثر على قيمته..ولو حاولنا نغير بقميته راح يصدر البرنامج خطأ اثناء جمع وتصريف البرنامج Compile-time..على سبيل المثال المتغير var من البرنامج السابق بقوم بحمايته بتعريف الدالة كالتالي:

LEFT TO RIGHT
void passByConstantRef(const int &x);

الآن لما بنجي نعمل التالي:

LEFT TO RIGHT
void passByConstantRef(const int &x)

{

x = 20;// Error خطأ

}

البرنامج راح يصدر خطأ وينبهك..بأن العنوان الممرر بواسطة المرجع معمول بواسطة تقنية pass by Constant Ref و لا يحق لنا نعمل معاه اي تعيين بواسطة المعامل (=). ولكن نستفيد منه بحسابات اخرى بدون منقدر نغير قيمته.

,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.

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

- تمرير بواسطة قيمة By Value:

نستخدم هذا النوع إذا كان نوع البيانات الممرر هو إحدى انواع البيانات الأولية مثل int, double, bool..البسيطة والأساسية بلغة ++C. لأنها اصلاً زغيرة الحجم ولن يكون لها اي استحسان في سرعة البرنامج. ايضاً نستخدم هذي التقنية لو كنا نريد تمرير نسخة Copy لقيمة كائن معين حتى لو كان كبير الحجم(إضظرارية يعني). هذا كل شيء ببساطة.

- تمرير بواسطة مرجع(سواء مؤشر او مرجع) By Reference:

نستخدم هذا النوع فقط لو كنا رايدين تغير قيمة الكائن الممرر (تذكري المتغير var كيف غيرنا قيمته من داخل دالة أخرى).

- تمرير بواسطة مرجع ثابت By Constant Reference:

نستخدم هذا النوع لو كنا رايدين تمرير قيمة كائن و لكن مع ضمان عدم تغيير قيمته داخل الدالة المُمرر إليها.

(التقنيتين الأخيرة نستعملهن نموذجياً مع الكائنات Object الكبيرة بالحجم تقريباً(.

,.,.,.,.,.,.,.,.

الموشرات Pointer مثل المراجِع Reference بخصوص هذي التقنيات..يختلفن بس لما بنجي نعمل مقارنة بينتاهن بالتحديد وليس من خلال هذه التقنيات. يعني ينطبق عليهن نفس الشيء..يعني الاختلاف راح يكون بخصوص الرموز تبعتهن مثل النجمة * و علامة & وطريقة استعمالها بشكل عادي مثل اللي درستيه انتي.

هذا كل شيء وبالله التوفيق.. هيا تعالي اسئلي المرة الجية وشوفي :happy: (بمزح انتي على الرحب والسعة اختي الكريمة)

,.,.,.,.,.,..,,..,,.,..,,.

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#41

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

صباح الخيررر...

اهااااااااااااا فهمت:)

علشان كذا في ال pass by value لما يخلص البرنامج شغل راح يرجع للقيمه الأساسيه لأن القيمه اللي اشتغلنا عليه كانت نسخه فقط....

أما في ال pass by refrence لما يخلص البرنامج شغل راح يوقف على القيمه النهائيه اللي وصلها لأنها هي القيمه الأصليه...

أختي رغد,,

أسأل الله أن يوفقك ويرزقك ماتتمنين...

#42

,.,..,.,,.,.,.,.,.,.,.

لااااا.. لا تعتبريها لم يخلص البرنامج او لما بتنتهي الدالة.لاااا ابداً.. :happy:

,..,.,.,,..,,.,.,.,.

تخيلي التقنيات هذي بأن pass_by_value تأخذ نسخة من قيمة المتغير الممرر إليها وخلص تتعامل جواتا مع هذي القيمة بحسب التصميم والهدف تبعها..خلص انتهت علاقتها بأصل المتغير الممرر.

,.,.,.,.,.,.,.,.,.,.

بخصوص التقنية التانية Pass_by_reference..تخيلي الدالة بتشاور بصباعا على العنوان تبع المتغير الممرر طيلة تنفيذ مهمتها وتأثر مباشرة على ذلك المتغير الممرر بواسطتها..ركزي بالك على كلمة طيلة..مش بعد ما ينتهي البرنامج او بعد ما تنتهي هي من العمل..لا..طيلة عملها وهي تأثر على المرجع الممرر..لأنه عنوان على الذاكرة.

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#43
شعاع الأمل كتب:

أختي رغد,,

أسأل الله أن يوفقك ويرزقك ماتتمنين...

آمين يا رب..وانتي كمان الله يوفقك ويرزقك ما تتمنين..ويشرح صدرك لأني كنت مقبوضة لحدة ما شفت دعوتك والله

:happy:

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#44

الصراحة الاخت رغد .. اكثر من روووعة ..

ويـآآريت المووضوع يثبت للإفادة .. لان

فية شرح للاخت رغد رآئع .. في عدة ردود ..

تحياتي لكي اختي رغد :lol:

Mysql

hm7bzmeskyfcyhsdmdv6.gif

#45
H4Z3M كتب:
الصراحة الاخت رغد .. اكثر من روووعة ..

ويـآآريت المووضوع يثبت للإفادة .. لان

فية شرح للاخت رغد رآئع .. في عدة ردود ..

تحياتي لكي اختي رغد :lol:

اهلين اخي الكريم..شاكرة مرورك وتعليقك...

,.,.,.,.,.,.,.

اطيب المُنى

:happy:

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#46

أختي رغد وأخوتي...

أتمنى شرح بالتفصيل للفرق بين pointer وال Refrence??

#47

ارجوكم أريد أن أفرق بينهم؟؟؟

#48

اهلاً اختي شعاع..طيب انطري شوي الله يخليك لحدة ما استجمع ولخصهن لك؟

إن شاء الله ما تنامي إلا لما تقريهن اليوم :happy:

,.,.,.,.,.,.,.,.,.,.,.

ساعة او اقل حتى

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#49

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

طبعاً انا متوقعة بأنكِ تعرفي ماهية كلاً منها..ولكن تريدين الفروق بينهن. :happy:

,.,.,.,.,..,,.,.,..,,.,.,..,

قبل أن نعرف الفرق بين المؤشر Pointer و المرْجِع Reference يجب ان نعود تاريخياً إلى الوراء قليلاً..حيثُ أن المؤشر هو تقنية منقولة ومحمولة من لغة C إلى لغة ++C(لا تعتبريها موروثة). ايضاً يمكننا القول بشكل كبير بأن كُل مرْجِع Reference هو مؤشر Pointer هو و ليس كُل مؤشر مرجع..يعني المؤشر اشمل مثل (كل سيارة مركبة وليست كل مركبة سيارة) :happy:... المرْجِع The Reference تقنية مخصصة للغة ++C تحديداً كمعالجة وتعويض عن المؤشرات(تقريباً في كثير من الحالات) حيثُ يوصي الخبراء باستخدامها عوضاً عن المؤشر متى سنحت الفرصة ومتى كان ذلك ممكناً..ولكن مع الحِفاظ (إعتقاداً) بأن المؤشر تقنية جيدة ومستعملة كثيراً في التطبيقات بواسطة لغة ++C..هذا كل شيء تقريباً جوهري وملموس حول المؤشر والمرجع وتاريخها..ابداً لا تكبري الموضوع براسك, لأن كل ما تبقى هو مُجرد فروق نحوية (وتقنية بسيطة كمان :happy:).

,.,.,.,.,.,.,.,.,.,.,.,.,.

الآن نتناول الفروق بطريقة سرد نقاط.

1- يمكننا عمل مؤشر لمؤشر آخر ..ولكن لا نستطيع عمل ذلك بواسطة المراجع: مثال

int x;

int *ptr = &x; //هذا مؤشر يُشير إلى عنوان المتغير إكس..عادي جداً

int **ptr1 = &ptr; // هذا هو المقصود من الفرق اعلاه..مؤشر يُشير إلى مؤشر آخر

2 – لا نستطيع عمل مصفوفة من المراجع Arrays of Reference, ولكن نستطيع عمل ذلك مع المؤشرات The Pointers.

#include <iostream>

using namespace std;

//البرنامج شرعي ومزبوط مع المؤشرات ولكن خطأ لو مع المراجع

int main()

{

int x, y, z;

x = 10;

y = 20;

z = 30;

int *arrPtr[3] = {&x, &y, &z}; //ما نقدر نعمل كذا مع المراجع

cout << (*arrPtr[0]) << endl;

cout << (*arrPtr[1]) << endl;

cout << (*arrPtr[2]) << endl;

return 0;

}

لأننا في الأصل لا نستطيع القفز بواسطة الحساب من عنوان لعنوان آخر بواسطة المراجع ...ولكن نستطيع ذلك بواسطة المؤشرات كالتالي: مثلاً:

*(ptr++)

أو

*(ptr+3)

السابق غير ممكن بواسطة المراجع..شوفي المثال التالي بالكامل:

#include <iostream>

using namespace std;

int main()

{

int x[] = {10,20,30};

int *ptr = &x[0];

cout << *(ptr+2) << endl; //ما نقدر نعمل مع المرجع مثل هذا

return 0;

}

3 – لا نستطيع استعمال المرجع مع ما يُعرف بـ Bit-field و هي نوع من الـ struct وتقنية خاصة بها..متقدمة شوي اختي الكريمة شعاع..بإمكانك قراءة تلك التقنية من مرجع آخر.. :happy:

تقريباً هذي الفروق الأساسية والجوهرية (إن لم تكن الكُل). و على الرحب والسعة وآسفة لتأخري لكن كنت مضغوطة اليوم شوي ببعض الأمور.

,.,.,.,.,..,.,.,,..,,..,.,.,.,.,

اطيب المُنى

:happy:

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#50

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

هلا وغلا فيك أختي....

الله يعطيك العافيه على هالشرح الحلوووو...

بس أبقولك جزء من فهمي.

يعني Refrence هو عباره عن شيء يؤشر على عنوان متغير..

وال Pointer هو شيء يؤشر على متغير أو على عنوان المتغير..

صح؟؟؟

طيب يالغاليه إذا ماعليك كلافه ممكن تحطين لي سؤال وأفرق فيه بينهموأنا اللي أبحاول أجاوب:)

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

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

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

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

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