السلام عليكم و رحمة الله و بركاته,
حديثنا اليوم عن إحدى الإضافات التي تم اعتمادها في لغة ++C, في الحقيقة أن البعض يعتقد أن لغة ++C أصبحت تسمى C++0x و لكن هذا غير صحيح!
C++0x هي محاولة للتعبير عن المقاييس الجديدة للغة, و ليست اسماً جديداً, اللغة التي نمرن أناملنا عليها حالياً هي لغة ++C حسب مقياس C++98!
بشكل عام فإن الميزات التي تم إضافتها تنقسم إلى قسمين,
الثانية : هي إضافات للمكتبة القياسية, و هذه في الحقيقة يمكن التعرف عليها بسهولة.
الأولى :ph34r: : هي إضافات في قلب اللغة! احذر هذا النوع من الإضافات قد يشيب شعرك قبل أن تفهم ما الفائدة, لأن معظم ما على الانترنت هو عبارة عن "تعاريف رسمية" للإضافات و لا يوجد حتى الآن من بدأ بكتابة الدروس حول هذه الإضافات حسب علمي.
عموماً حتى لا يطول الكلام, فإن الكلام اليوم سيدور حول ميزة تسمى Rvalue reference!
أحب أن أطرح مثالاً نبدأ به النقاش ثم نستشف الفائدة,
تخيل معي أنك و خلال كتابة برنامجك العزيز لديك السطر التالي :
string first, second, third; first [color= #000000;]= [color= #A31515;]"Khaled "; second [color= #000000;]= [color= #A31515;]"Alshaya"; third [color= #000000;]= first [color= #000000;]+ second;
third [color= #000000;]= first [color= #000000;]+ second;
مالذي تعتقد أنه قد حصل في هذا السطر ؟
ببساطة شديدة, سيتم إنشاء "كائن مؤقت" و لنتخيل العملية رغم أن هذا الكائن لا اسم له في برنامجنا و لكن لنتخيل ما الذي سيحصل لو كان اسمه "tmp" :
tmp [color= #000000;]= first; tmp [color= #000000;]+[color= #000000;]= second; third [color= #000000;]= tmp;
العملية بسيطة, صحيح!
و لكن في السطر الثالث, هناك ما لا أستطيع تسميته خطأ و لكن يمكن أن تسميه خطأ في الفكر البرمجي!
لماذا ؟
سيتم نسخ محتويات الكائن tmp إلى الكائن thrid!
لماذا أصلاً احتجنا لعملية النسخ؟ أليس من الأفضل لو "نقلنا" محتويات الكائن tmp إلى الكائن third!
اصلاً الكائن tmp ليس له فائدة بعد أن قام بجمع النصين, و بالتالي فإن عملية النسخ نفسها خاطئة من ناحية الفكرة!
في هذا السطر مثلاً :
tmp [color= #000000;]= first;
لأننا قد نستخدم الكائن first بعد ذلك.
هذه هي الإضافة ببساطة شديدة!
الآن لننزل قليلاً و لنتعرف على هذه الميزة بشكل أكثر تفصيلاً,
هنااااااك :lol: في ++C شيء اسمه reference variable :
[color= #0000ff;]int number [color= #000000;]= [color= #ff0000;]0; [color= #0000ff;]int[color= #000000;]& refNumber [color= #000000;]= number;
في الحقيقة أننا لا يمكننا أن نقوم باسناد قيمة غير ثابتة لهذا المرجع!
كيف تقول قيمة غير ثابتة و انت قد أسندت "المتغير" number ؟
المتغير number يحتوي على قيمة غير ثابتة و لكن عنوانه "ثابت" بالنسبة للبرنامج.
لو عدنا للمثال في بداية الحديث وطبقنا نفس المفهوم :
string[color= #000000;]& refStr [color= #000000;]= functionThatReturnString[color= #000000;]([color= #000000;]); [color= #007f00;]// This is crap.. ERROR
فلا يمكننا اسناد المرجع إلى متغير مؤقت!
هل فهمت القصة ؟
في ++C "الجديدة" سيمكننا كتابة شيء مثل التالي :
string[color= #000000;]&& RrefStr [color= #000000;]= functionThatReturnsString[color= #000000;]([color= #000000;]); [color= #007f00;]// This is good
بالطبع فإن كائن النص في النسخة الجديدة, سيحتوي على ما يسمى بالـ move constructor إضافة طبعاً للـ copy constructor المعتاد,
هناك بالطبع فوائد "كثيرة" غير الذي ذكر و لأنني مصاب بالكسل منذ عدة سنوات فلن أكمل و سأدعكم تبحثون عن الباقي :)
كان هذا لمحة و لا يمكن اعتباره بأي شكل درساً أو مقدمة إنما لمحة بسيطة لا أكثر :)
قبل أن أنهي حديثي هناك ميزة أخرى ضمن الميزات الجديدة تسمى run time concepts :) الفكرة قدمت من مهندسي شركة Adobe و تمت الموافقة عليها. و تعتبر بعداً جديداً في البرمجة لم يسبق أن تطرقت إليه أي لغة من قبل و هو عبارة عن مزيج من الـ run time polymorphism و الـ compile time polymorphism أو ما يسمى بالـ templates ربما نعطي عنها لمحة في المرة القادمة :)
إذا كان لديكم أي سؤال أو استفسار فأن في الخدمة :)
تحياتي ,,


