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

مافائدة الكلمة المحجوزة Explicit

بدأه Abdullah.Alshammeri في 25 يوليو 2009 · 5 رد · 564 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

- مافائدة الكلمة المجوزة explicit والتي يضعها البعض قبل الباني Constructor ؟

- هل هي قياسية .. ومتى استخدمها .. ولماذا تعتمد عليها المؤشرات الذكية auto_ptr .

- هل يمكن الاستغناء عنها أو ايجاد بديل لها ...

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

عندما تضع explicit فأنت لا تسمح للمترجم بعمل أي conversion للـ arguments لمحاولة مطابقتهم مع أنواع الـ parameters.

بمعنى أنه إذا كان لديك parameter من نوع int فسيصدر المترجم خطأ إذا مررت char! بدونها فإن char ستحول إلى int و سيعمل الكود بشكل طبيعي,

إذا كانت عمليات الـ conversions قد تؤدي إلى تغيير معنى الـ argument بالنسبة لصنفك فربما تريد استخدامها, إلا أني لم استخدمها من قبل,

من أخونا وجدي :)

Using Explicit In Constructor

تحياتي أخي الشمري...

#3

ههه .. تبّاً .. لم أبحث ..

شكراً أخي خالد على ردّك السريع , وشكرا للاخ وجدي من مسافة بعيدة .. لتصل الى موضوعه الرائع .

لكن بقي نقطة , أو أكثر من نقطة , وهي هل هي قياسية وليس لها بديل , ولماذا تستخدمها auto_ptr ، أين الخطر في الموضوع,السؤال للجميع .

لاتقل أن هناك من تحدّث عن هذه النقطة أيضاً :D .

تم تعديل هذه المشاركة بواسطة الشمري في 26 يوليو 2009 في 00:16

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

نعم هي قياسية ...

ويستخدمها auto_ptr لسبب وجيه وهو أن فلسفه هذا الClass هي أنه يتم تدمير الObject الذي يقوم بالتأشير عليه عند تدميره . فهو ليس مثل المؤشر العادي الذي عند تدميره يتجاهل تدمير الكائن الذي يقوم بالتأشير عليه ... بل أيضاً يقوم بتدميره معه ...

طيب ودخل هذا في هذا ... جرب إنك تكتب دالة تستقبل <auto_ptr<int وتقوم بتمرير مؤشر عادي من نوع *int له , وحاول الوصول له بعد إنتهاء عمل هذه الدالة ... وستعرف السبب ... طبعاً هذا الكلام إذا قمت بإزالة هذه الكلمة من ملف الهيدر ... تستطيع إزلتها ومن ثم إرجاعها لتعرف الفرق ...

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

#5
اقتباس
لكن بقي نقطة , أو أكثر من نقطة , وهي هل هي قياسية وليس لها بديل , ولماذا تستخدمها auto_ptr ، أين الخطر في الموضوع,السؤال للجميع .

أكيد قياسية :) لا تخف لست الوحيد الذي يجد أشياء لم يراها في ++C :lol: كل مبرمجي ++C حتى المخضرمين!

لماذا تستخدم في auto_ptr ؟ :hmm:

كما قلت للحفاظ على الـ integrity :)

انظر للمثال التالي :

std::auto_ptr<int> y(0x500);

هذا الكود سيصدر خطأ وقت الترجمة, لماذا لأن الـ 0x500 ليست من النوع *int, ولكنها من النوع int,

لو لم تذكر explicit في الـ constructor فإنه سيصبح من الممكن أن تسند أعداداً إلى auto_ptr و بعد ذلك ستحصل الدواهي في الذاكرة :P

يجب أن يكون نوع الـ argument مطابقاً "بالضبط" لنوع الـ parameter!

هل تستخدمها أو لا ؟ هذا يعتمد على الصنف الذي تقوم ببنائه, هل يحتاج لها أم لا, في العادة لن تحتاج لها, أحياناً ستحتاج لها كما في الـ smart pointers و الـ auto_ptr :)

تحياتي ...

#6

قمت بالتطبيق , جزاكم الله خير , الصورة واضحة الان بالنسبة لـ explicit , ولكن ظهرت بعض الاسئلة حول auto_ptr نضعها في موضوع اخر ان شاء الله :-( .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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