السلام عليكــم ورحمـة الله وبركاتــه ،،
- مافائدة الكلمة المجوزة explicit والتي يضعها البعض قبل الباني Constructor ؟
- هل هي قياسية .. ومتى استخدمها .. ولماذا تعتمد عليها المؤشرات الذكية auto_ptr .
- هل يمكن الاستغناء عنها أو ايجاد بديل لها ...
السلام عليكــم ورحمـة الله وبركاتــه ،،
- مافائدة الكلمة المجوزة explicit والتي يضعها البعض قبل الباني Constructor ؟
- هل هي قياسية .. ومتى استخدمها .. ولماذا تعتمد عليها المؤشرات الذكية auto_ptr .
- هل يمكن الاستغناء عنها أو ايجاد بديل لها ...
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
عندما تضع explicit فأنت لا تسمح للمترجم بعمل أي conversion للـ arguments لمحاولة مطابقتهم مع أنواع الـ parameters.
بمعنى أنه إذا كان لديك parameter من نوع int فسيصدر المترجم خطأ إذا مررت char! بدونها فإن char ستحول إلى int و سيعمل الكود بشكل طبيعي,
إذا كانت عمليات الـ conversions قد تؤدي إلى تغيير معنى الـ argument بالنسبة لصنفك فربما تريد استخدامها, إلا أني لم استخدمها من قبل,
من أخونا وجدي :)
تحياتي أخي الشمري...
ههه .. تبّاً .. لم أبحث ..
شكراً أخي خالد على ردّك السريع , وشكرا للاخ وجدي من مسافة بعيدة .. لتصل الى موضوعه الرائع .
لكن بقي نقطة , أو أكثر من نقطة , وهي هل هي قياسية وليس لها بديل , ولماذا تستخدمها auto_ptr ، أين الخطر في الموضوع,السؤال للجميع .
لاتقل أن هناك من تحدّث عن هذه النقطة أيضاً :D .
تم تعديل هذه المشاركة بواسطة الشمري في 26 يوليو 2009 في 00:16
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
نعم هي قياسية ...
ويستخدمها auto_ptr لسبب وجيه وهو أن فلسفه هذا الClass هي أنه يتم تدمير الObject الذي يقوم بالتأشير عليه عند تدميره . فهو ليس مثل المؤشر العادي الذي عند تدميره يتجاهل تدمير الكائن الذي يقوم بالتأشير عليه ... بل أيضاً يقوم بتدميره معه ...
طيب ودخل هذا في هذا ... جرب إنك تكتب دالة تستقبل <auto_ptr<int وتقوم بتمرير مؤشر عادي من نوع *int له , وحاول الوصول له بعد إنتهاء عمل هذه الدالة ... وستعرف السبب ... طبعاً هذا الكلام إذا قمت بإزالة هذه الكلمة من ملف الهيدر ... تستطيع إزلتها ومن ثم إرجاعها لتعرف الفرق ...
فهي بإختصار تقول للمترجم لا تقوم بإستدعاء هذا الConstructor ما لم يقوم المبرمج بنفسه بإستدعائه بشكل صريح ... فوقته لو وجد الكمبايلر أنه يمكنه القيام بالتحويل بين الأنواع فلن يفعل ويعطيك رسالة خطأ ...
اقتباسلكن بقي نقطة , أو أكثر من نقطة , وهي هل هي قياسية وليس لها بديل , ولماذا تستخدمها 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 :)
تحياتي ...
قمت بالتطبيق , جزاكم الله خير , الصورة واضحة الان بالنسبة لـ explicit , ولكن ظهرت بعض الاسئلة حول auto_ptr نضعها في موضوع اخر ان شاء الله :-( .
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri