تعرف الى لغة سى ++ intro to c

0

تعرف الى لغة سى ++ intro to c

  (تنطق: سي  شيوعاً[3][4] وقد استخدمت على نطاق واسع في بناء أنظمة التشغيل والتعامل مع البنية الصلبة للحاسوب ابتداءً من الأنظمة البرمجية وبرامج المستخدم، مروراً بمشغ وفقاً لوثيقة التصحيح التقنية ISO/IEC 14882:2003. يتضمن المعيار الحالي ISO/IEC 14882:2011 مجموعة من الميزات التي تم الاتفاق عليها ونشرها كمعيار جديد من المنظمة ال
وإلا فقد كان من الأجدر استخدامالزيادةالسابقة بحيث يصبح اسم اللغةC++ بدلاً من استخدام الزيادة اللاحقةكما في الاسم الحالي.[9].لا توجد لغة باسم C بلاس علماً أنه توجد لغة مختلفة بلس بلس) (بالإنجليزية: ++C) هي لغة برمجة كائنية، متعددة أنماط البرمجة، مصرفة، سكونية الأنماط. وتضم العديد من ميزات لغات البرمجة عالية المستوى ومنخفضة المستوى. بدأ تطوير هذه اللغة كامتداد للغة C تحت اسم (C مع الصفوف) من قبل بيارن ستروستروب في مختبرات بل عام 1979 وتم إضافة العديد من الميزات الأخرى لاحقاً وتغير الاسم عام 1983 ليصبح ++C [2] من باب الدعتماماً اسمها +ABCL/c. هنالك بعضاللغات التي سميت بشكل قريب من ++C أشهرها لغة—C ولغة #C.ائية (++C) إلى ريكماسيتي (أواسط عام 1983) وقد استخدم هذه التسمية لأول مرة في كانون الأول عام1983. عندما سُؤل ماسيتي عام 1992 عن سبب تسمية اللغة بهذا الاسم أجاب أنه قامبذلك من باب المزاح. ويعود أصل الاسم إلى استخدام معامل الزيادة (++) من لغة C لات الأجهزة والأنظمة المضمنة وانتهاءً بالمخدمات عالية الأداء وبرامج التسلية كالألعاب الفيديوية نظراً لقدرة تصريفها إلى كود لغة تجميع شديد الفعالية[5]. أحد أكثر استخدامات ++C إثارةً للإعجاب حسب رأي ستروستروب هو استخدام ++C في كتابة قسم كبير من أنظمة القيادة الأوتوماتيكية للعربات التي تجولت على سطح المريخ (مارس روفر) [6].
يوجد العديد من المصرفات التجارية والمفتوحة المصدر لـ++C، من هذه المصرفات مشروع جنو، مصرفات إنتل، مصرفات مايكروسوفت، مصرفات استديو أوراكل سولاريس، مصرفات ديجيتال مارس، ومصرفات إيمباركاديرو تكنولوجيز. لقد أثرت لغة ++C بالعديد من لغات البرمجة الشائعة مثل #C [1] وجافا. في حين تستخدم لغات أخرى كلغة Objective-C نحواً شديد الاختلاف ومقاربة مختلفة في إضافة الصفوف إلى C.ابة عبر استخدام معامل الزيادة لجانب اسم لغة C تأكيداً على أنها "التالي للغة C".
تعتبر ++C إحدى اللغات الأكثر
بدأت ++C كتحسين للغة C، أولاً عبر إضافة الصفوف ومن ثم التوابع الظاهرية وتحميل المعاملات الحسابية والوراثة المتعددة والقوالب ومعالجة الاستئناءات بالإضافة إلى ميزات الأخرى. بعد سنوات من التطوير تم تصديق ++C عام 1998 كمعيار آيزو ذو الاسم ISO/IEC 14882:1998. وفي عام 2003 تم تعديل المعياروالذي يقبيارن ستروستروب، مبتكر لغة ++C

أصل تسمية ++C

يقول ستروستروب: "يؤكد الاسم الطبيعة التطورية للتغيرات المحدثة على لغة C" [8]. أثناء مرحلة التطوير تم تسمية ++C بشكل غير رسمي "C الجديدة" (بالإنجليزية: new C) ثم تغير الاسم إلى "C مع الصفوف" (بالإنجليزية: C with classes). يعود الفضل في التسمية النهل من لغة C وم بزيادة قيمة المتغير المسند له والاستخدام الشائع لرمز (+) للدلالة على حصول تحسين في برنامج حاسوبي. الدعابة تكمن في أن الاسم نفسه يحتوي على خطأ: ذلك أن استخدام الزيادة اللاحقة (بالإنجليزية: post-increment) يسبب زيادة المتحول بعد تقييم قيمة المتحول السابقة (على عكس الزيادة السابقة (بالإنجليزية: pre-increment)) بمعنى أن لغة ++C ليست أفض

المعايير

السنة معيار ++C الاسم الشائع
2014 N3690 [10] C++14
2011 ISO/IEC 14882:2011[1ار السابق ونشرت عام 2003 إصداراً مصححاً من معيار ++C اسمه ISO/IEC 14882:2003. نُشر تقرير تقني عام 2005 اسمه (التقرير التقني 1 (بالإنجليزية: Technical Report 1)، أو اختصاراً TR1) . وصّف التقرير مجموعة من الامتدادات للمكتبة المعيارية -على الرغم من أنه ليس جزءاً من معيار اللغة- بحيث يتم اعتماد هذه الامتدادات في الإصدار التالي من ++C.
C++11 هو المراجعة الأحدث لمعيار ++C وقد عرف سابقاً باسم C++0x وتمت المصادقة عليه من قبل ISO/IEC في 12 آب 2011[15] ونشر باسم 14882:2011[16] . و1]
C++11
2007 ISO/IEC TR 19768:2007[12] C++TR1
2003 ISO/IEC 14882:2003[13] سي++03
1998 ISO/IEC 14882:1998[14] C++98
قامت لجنة تعيير ++C (مجموعة عمل ISO/IEC JTC1/SC22/WG21) عام 1998 بتعيير لغة ++C ونشرت المعيار ISO/IEC 14882:1998 (المعروف بشكل غير رسمي باسم C98). بعد نشر المعيار ببعض السنوات تفحصت اللجنة تقارير عن أخطاء ومشاكل المعيهنالك خطط لمراجعة طفيفة (C++14) وأخرى رئيسية (C++17) في المستقبل [17].

فلسفة اللغة

في كتاب
  • C كلغة عمومية، سكونية التنميط وتتمتع بفعالية ومحمولية لغة C
  • صُممت 
  • +C كي تعمل بدون وجود بيئات تطوير معقدة
  • في كتاب "النموذج الكائني للغة ++C" (ليبمان، 1996) يشرح الكاتب إمكانية تحويل مصرفات ++C العبارات البرمجية إلى توضعات داخل الذاكرة. إلا 
"تصميم وتطوير لغة ++C" (ستروستروب، 1994) يصف بيارن ستروستروب بعض القواعد التي استلهم منها تصميم ++C:
  • صُممت ++أن هذا لا يمنع بالطبع مصممي المصرفات من اعتماد طرقهم الخاصة في كتابة مصرفات متوافقة مع المعيار المرجعي ++C.
  • ++C لتدعم بشكل مباشر وغني عدة أنماط برمجية (برمجة إجرائية، تجريد البيانات، البرمجة الكائنية والبرمجة العامة)
  • صُممت ++C لتتيح المبرمج حرية الخيار حتى وإن كان اختيار المبرمج غير صحيح
  • صُممت ++C بحيث تتوافق مع لغة C قدر الإمكان لتوفر بالتالي انتقالاً سلساً إليها لدى الحاجة
  • تتجنب ++C الميزات الخاصة بمنصة محددة فقط وغير عمومية
  • لا تحمّل ++C البرمجيات المكتوبة أعباء ميزات اللغة في حال عدم استخدامها (مبدأ العبء المعدوم)
  • صممت لغة +

مزايا اللغةل التابع في إعادة قيمة يسبب سلوكاً غير معرف في حال كان توقيع التابع يشير إلى إعادة قيمة من نمط مخالف للنمط void[20] (تقدم المصرفات عادة معلومات كافية لتشخيص مشكلة كهذه). الاستثناء الوحيد لهذه القاعدة هو التابع main والذي يعيد ضمنياً القيمة 0 في حال عدم الإشارة صراحة إلى ذلك[21].

المعاملات وم

ترث لغة ++C نحو لغة C، فيما يلي إصدار من برنامج أهلاً بالعالم مكتوب بهذه اللغة من قبل بيارن ستروستروب [19]، يتم في هذا البرنامج استخدا}
من الجدير بالملاحظة أن فش
م مجرى الخرج الموجود في مكتبة ++C المعيارية من أجل كتابة عبارة !Hello, World إلى الخرج المعياري.
# include <iostream>

int main()
{
   std::cout <<"Hello, world!\n";

تاحة من اللغة نفسها (بحيث أن المستخدم لا التحميل الزائد للمعاملات

توفر لغة ++C ما يزيد عنع المؤشرات) ومعاملات المقارنة والمعاملات المنطقية وغيرها. يمكن تحميل معظم المعاملات بشكل زائد من قبل المستخدم مع بعض الاستئناءات الجديرة بالملاحظة مثل معاملات الولوج إلى الأعضاء (. و .*) وكذلك المعاملات الشرطية. تعتبر ميزة تلإدارة الذاكرة:

  • حجز سكو 35 معاملاً بما فيها المعاملات الحسابية الأساسية ومعاملات التلاعب بالبتات ومعاملات إزالة الأدلة (الخاصة بالتعامل يستطيع تمييز الفوارق بينها). يعتبر التحميل الزائد للمعاملات أساسياً أيضاً في العديد من الميزات المتقدمة للبرمجة  باستخدام ++C كتقنية المؤشرات الذكية. من الجدير بالملاحظة أن التحميل الزائد للمعاملات لا يغير من قواعد أسبقية المعاملات ولا يغير من عدد المتحولات التي يتعامل معها المعامل (يمكن على كل الأحوال للمعامل أن يهمل بعض المتحولات، إلا أن المتحولات سيتم تقييمها قبل تنفيذ المعامل). إن التحميل الزائد لمعاملات "&ني للذاكرة. يُسند للمتحول السكوني قيمة أثناء ترجمة (تصريف) البرنامج كما تٌعطى المساحة المحجوزة مكاناً ثابتاً ضمن الكود التنفيذي. تعرف المتحولات السكونية باستخدام الكلمة المفتاحية static (المقصود هنا حجز مكان سكوني وليس حجز عض
  • دى إسناد قيمة إليه. يتم استدعاء الباني

حميل المعاملات بشكل زائد حجر الأساس في تمكين استخدام الأنماط المعرفة من قبل المستخدم إضافة إلى تسهيل استخدام الأنماط الم&" و"||" يفقدها خاصية تقييم قصر الدارة التي تكسبها فعالية في الأداء.

إدارة الذاكرة

تدعم ++C أربع طرق  عند تنفيذ التعريف عن المتحول، ويتم استدعاء الهادم عندما يصبح المتحول خارج نطاق الرؤية وبعد استدعاء الهادم يتم تحرير الذاكرة المحجوزة.
  • حجز ديناميكي للذاكرة. يتم حجز مكان للمتحول ضمن الكومة (بالإنجليزية: heap) عن طريق الإدارة اليدوية للذاكرة باستخدام الكلمات المفتاحية new وdelete (لا تزال ++C تدعم توابع C التقليدية الخاصة بإدارة الذاكرة ()malloc و()free).
  • تتيح بعC البرمجة العمومية (با
    بعض الاستبدالات 
  • و خاص بالصف).
  • حجز أوتوماتيكي للذاكرة. يٌصرح عن المتحول الأوتوماتيكي ببساطة باستخدام اسمه ونمطه، يحجز لهذه المتحول مكان في المكدس لغير ممكنة إلا أنها لا تولد أخطاءً، يعود الفضل في ذلك إلى سياسة تقرير التحميل الزائد للقوالب التي توصف بالعبارة التالية: "الفشل في الاستكلفة. قد تزيد القوالبض المكتبات استخدام تقنية جمع القمامة. يُستخدم جامع القمامة بوم بشكل شائع لهذا الغرض.
إن تمكين المستخدم من إدارة الذاكرة بشكل كامل شبيه بلغة C على عكس لغات البرمجة التي تعمد إلى إخفاء تفاصيل كهذه عن المبرمج مثل لغة Java وPerl وPHP وRuby.

القوالب

تتيح قوالب ++ من حجم الكود ذلك أن كل تخصيص للقالب ينتج نسخة من كود القالب: إلا أن نسخة توليد نسخة من أجل كل مجموعة من وسطاء القالب يكافئ إللإنجليزية: generic programming). تدعم ++C كلاً من قوالب الصفوف وقوالب التوابع. يمكن إعطاء القوالب ثلاث أنواع من البارامترات: أنماط، ثوابت معرفة وقت التصريف، وقوالب أخرى. يتم تخصيص القوالب وبناء نماذج منها وقت التصريف. لبناء قالب يقوم المصرف باستبدال بارامترات القالب بوسطاء محددة من أجل توليد تابع حقيقي أو نموذج عن صف.ى حد ما نفس حجم الكود الناتج من كتابتها بشكل يدوي[22]. إن هذا السلوك مخالف للكائنات العمومية (بالإنجليزية: generics) التي تعمل وقت التنفيذ والمدعومة في عدد من اللغات (مثل لغة Java) حيث يحذف النمط وقت التصريف ويحفظ جسم وحيد للقالب ليتم استخدامه وقت التنفيذ.
تختلف القوالب عن الماكروز بعدة نواحٍ: على الربدال ليس خطأ" (SFINAE) (بالإنجليزية: Substitution failure is not an error) تحاول هذه السياسة استنباط الاستبدالات الصحيحة حتى وإن قادت بعض الاستنباطات إلى استبدالات خاطئة. تقدم القوالب أداة قوية يمكن استخدامها للبرمجة العمومية والميتا-برمجة (بالإنجليزية: metaprogramming) باستخدام القوالب كذلك يمكن استخدامها في أمثَلة الكود إلا أن هذه القوة لا تأتي بدون تغم من أن كلا الميزتين توفران تصريفاً شرطياً إلا أن القوالب ليست محدودة بالاستبدال اللفظي فقعلى إنشاء رموز جديدة بمفردها. تعتبر القوالب أداة لتحقيق تعدد الأشكال (بالإنجليزية: polymorphism) السكوني والبرمجة العمومية.
إضافة لما سبق تجدر الإشارة إلى أن القوالب هي ميكانيكية وقت-التصريف خاصة بلغة ++C تتمتع بميزة أنها تورينغ-كاملة بمعنى أنه يمكن استخدام القوالب لكتابة برامج يمكنهاط حيث أن لديها اطلاع على معاني ونظام التنميط الخاص باللغة بالإضافة إلى معرفتها بتعاريف الأنماط وقت التصريف كما يمكنها القيام بالعديد من المهام العالية المستوى مثل إمكانية ضبط التدفق برمجياً من خلال تقييم البارامترات ذات الأنماط المعروفة قسراً. لدى الماكرو القدرة على القيام بالتحكم الشرطي في التصريف بناءً على شروط محددة سلفاً إلا أنها غير قادرة على خلق أنماط جديدة أو استدعاء نفسها ذاتياً أو القيام بتقييم الأنماط ويبقى تأثيرها محدوداً باستبدال السلاسل النصية و(عدم)تضمين النصوص مباشرة قبل التصريف. بمعنى آخر تستطيع الماكروز التحكم بتدفق التصريف بناءً على رموز معرفة سابقاً إلا أنها -على خلاف القوالب- غير قادرة  القيام قبل التنفيذ بكافة الاحتسابات التي يمكن القيام بها باستخدام أي برنامج حاسوبي.
يمكن تلخيص ما سبق بالقول أن القوالب هي توابع أو صفوف مضاف إليها بارامترات تعمل وقت التصريف وتكتب بدون معرفة مسبقة بالوسطاء المستخدمة لتحقيق نماذج مخصصة منها. إن الكود الناتج من تخصيص القالب مكافئ للكود المكتوب بشكل يدوي خصيصجة الكائنية التوجه (OOP) إلى لغة C، فقد تم إضافة الصفوف التي تقدم بدورها الميزات كائنية التوجه الأربعة الشائعة في أغلب لغات البرمجة الكائنية التوجه (وكذلك بعض اللغات الغير كائنية التوجه): التجريد، التغليف، الوراثة، تعدد الأشكال. إحدى أهم ميز والمعاملات سيتم استخدامها اً من أجل الوسطاء الممررة. بهذه الطريقة توفر القوالب طريقة لفصل الجوانب العمومية والقابلة للتطبيق على نطاق واسع على شكل توابع وصفوف (مرمزةً كقوالب) عن الجوانب المخصصة (مرمزةً كبارامترات للقوالب) دون أن يسبب هذا التجريد خسارة في الأداء.

الصفوف

تضيف ++C مزايا البرمبالشكل المحدد ولجعل نموذج استخدامها أكثر وضوحاً بالنسبة للمطور. توفر لغة ++C إمكانية تعريف الصفوف والتوابع كتقنيات بدائية للتغليف. يمكن لأعضاء الصف أن يعرف عاط. لهذا السبب لا تدعم ++C البرمجة كائنية التوجه فقط بل تدعم أيضاً نماذجاً بات صفوف ++C التي تفرقها عن باقي اللغات هي دعم الهوادم الحتمية والتي توفر بدورها دعماً لمفهوم استحواذ المصدر عبر تهيئته (RAII) (بالإنجليزية: Resouce Acquisition is Initialization).

التغليف

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

الوراثة

ماً (بالإنجليزية: public) أو محمياً (بالإنجليزية: protected) أو خاصاً (بالإنجليزية: private) لتطبيق مفهوم التغليف صراحةً. يمكن لأي تابع الولوج إلى عضو عام في حين لا يمكن الولوج إلى الأعضاء الخاصة إلا من قبل التوابع الأعضاء بالإضافة إلى التوابع والصفوف "الأصدقاء" أي تلك الممنوحة صلاحية الولوج إلى الأعضاء الخاصة بالصف (باستخدام الكلمة المفتاحية friend). يمكن الولوج للعضو المحمي من قبل كافة أعضاء الصفوف الوارثة إضافة إلى الصف نفسه وجميع "أصدقاءه".
يشير المبدأ الكائني التوجه إلى أنه في حال كان لدى تابع صلاحية الولوج إلى البنية الداخلية لنمط ما وجب تغليف هذا التابع ضمن تعريف النمط. تدعم ++C هذا المبدأ (من خلال التوابع الأعضاء والتوابع الصديقة) إلا أنها لا تجبر المبرمج على تطبيقه: إذ يمكن للمبرمج أن يعرف أجزاءً من تمثيل النمط كأعضاء عامة بحيث يمكن الولوج إليها من قبل كيانات خارجية ليست بالضرورة جزءاً من تمثيل النم
تتيح الوراثة لنمط بيانات ما أن يكتسب خصائص نمط بيانات آخر. يمكن للوراثة من صف القاعدي (أو الصف الأب) أن تعرف كوراثة عامة public أو محمية protected أو خاصة private. تتيح معرفات الوصول هذه تحديد فيما إذا كانت الصفوف المشتقة وعديمة الصلة تستطيع الولوج إلى الأعضاء العامة والمحمية الخاصة بالصف القاعدي. إن الوراثة العامة فقط هي التي تتناسب مع المعنى المقصود عادةً بالـ"وراثة" ويعتبر النوعان المتبقيان أقل استخداماً بشكل كبير. في حال تم حذف معرف الوصول تكون الوراثة بين "الصف" المشت ++C إذ لا توجد هذه الميزة في أغلب لغات البرمجة الأخرى، تتيح الوراثة المتعددة لصف ما أن يُشتق من أكثر من صف قاعدي واحد؛ تتيح هذه الميزة إنشاء علاقات وراثية أكثر دقة. فعلى سبيل المثال يمكن لصف "القط الطائر" أن يرث من كلابع ليتم تعويضها بقيمهاعادةً بشكل صريح في الصف المشتق ولا يتم توريثها ضمنياً. تتمتع الوراثة الظاهرية في لغة ++C بميزة إجلاءٍ للغموض اسمها الهيمنة (بالإنجليزية: dominance).

تعددية الأشكال

يتيح تعدد الأشكال توفير واجهة مشتركة لتحقيقات (implementation) عديدة، كما تتيح للكائنات أن تتصرف بطرق مختلفة حسب الأوضاع المختلفة. توفر ++C العديد من أنواع تعد الصفين "قط" و"لبون طائر". بعض اللغات الأخرى مثل لغة Java ولغة #C تحقق هدفاً شبيهاً (على الرغم من كونه محدوداً أكثر) عبر إتاحة الوراثة من واجهات متعددة في حين حصر عدد الصفوف القاعدية بصف واحد فقط (تتيح الواجهات -على خلاف الصفوف- إمكانية التصريح عن التوابع الأعضاء دون إمكانية إضافة تحقيق لها أو إضافة أعضاء بيانية). يمكن تعريف واجهة كما في لغة #C ولغة Java في لغة ++C أيضاً كصف يحتوي فقط على توابع ظاهرية صرفة (pure virtual)، يعرف هكذا الصف باسم صف قاعدي مجرد (ABC) (بالإنجليزية: Abstract Base Class). تعرّف التوابع الأعضاء الخاصة بصف قاعدي مجرد
لدى التصريح عن تابع ما يمكن للمبرمج أن يسند لبارامتر واحد أو أكثر قيمة افتراضية. في حال القيام بذلك يمكن إهمال هذه البارامترات لدى استدعاء التادية الأشكال السكونية (وقت التصريف) والديناميكية (وقت التنفيذ). في حين لا تتيح تعددية أشكال وقت التصريالسبب قد يشير اسم التابع ذاته إلى توابع مختلفة حسب السياق الذي يتم استخدامه به. من الجدير بالملاحظة أن نمط القيمة المعادة للتابع لا يستخدم للتفريق بين التوابع المحملة بشكل زائد وبؤدي في حال اعتماده إلى رسالة خطأ أثناء ترجمة البرنامج. الافتراضية. عند استدعاء تابع باستخدام عدد من الوسطاء أقل من عدد البارامترات المصرح عنها يتم مطابقة الوسطاء الف اتخاذ بعض القرارات أثناء التنفيذ تنطوي تعددية أشكال وقت التنفيذ على بطء نسبي في الأداء.

تعددية الأشكال الساكنة

يمكّن التحميل الزائد للتوابع من كتابة توابع تحمل الاسم نفسه (ولكن لها وسائط مختلفة). يتم تمييز التوابع عن بعضها البعض من خلال عدد وأنماط بارامتراتها. لهذا ممررة مع البارامترات الموافقة لها من اليسار إلى اليمين ومن ثم يتم إعطاء أي بارامتر لم تتم مطابقته قيمته الافتراضية. في الكثير من الحالات يفضل استخدام تصريح واحد للتابع مع قيم افتراضية بدلاً من توفير عدد من التوابع

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

بالإضافة إلى التوابع الأعضاء القياسية يمكن ل

 المعرفة بش
كل زائد لديها أعداد وأنماط مختلفة من البارامترات.
توفر قوالب لغة ++C تقنية متطورة ومعقدة لكتابة كود عمومي متعدد الأشكال. تحديداً يتيح نمط القالب غريب التكرار (بالإنجليزية: Curiously Recurring Template Pattern) كتابة نماذج من تعدد الأشكال السكوني تحاكي بشكل قريب أسلوب كتابة تجاوز التوابع الظاهرية. تستطيع قوالب ++C التعرف على الأنماط وتتمتع بكونها تورينغ-كاملة، تمكّن هاتين الميزتين من استخدام المصرّف لحل الشرطية العودية وتوليد برامج هامة باستخدام ميتا-برمجة القوالب. خلافاً للمعتقد السائد فإن استخدام القوالب لا يولد كوداً عديم الفائدة عند التصريف بشرط استخدام الإعدادات المناسبة للمصرف[22].

تعددية الأشnamic_cast الذي يتيح للبرنامج أن يحاول بأمان (بدون أخطاء) تحويل نمط كائن إلى نمط آخر أكثر تحديداً (على خلاوجد اختلاف في عدد وأنماطتوابع التحميل الزائكال الديناميكية

الوراثة
تستطيع المتحولات من نمط المؤشرات (والأدلة) التي تشير إلى صف قاعدي أن تشير أيضاً إلى أي كائن من نمط صف مشتق من ذاك الصف القاعدي بالإضافة إلى الكائنات التي تطابق نمط المتحول. تمنح هذه الميزة مصفوفات وحاويات المؤشرات إمكانية الإشارة إلى كائنات من أنماط مختلفة. يحدث هذا السلوك وقت التنفيذ عادةً ذلك أن المتحولات غالباً ما تسند لها القيم وقت التنفيذ.
توفر ++C المعامل dyد للمعاملات والهوادم أن تكون ظاهرية أيضاً. تقول القاعدة العامة أنه في حال وجود تابع عضاً ظاهرياً صرفاً واحداً على الأق التابع يجب استدعاؤها؛ لهذا السبب يؤجل هذا القرار إلى حين وقت التنفيذ وتسمى هذه السياسة الترحيل الديناميكي (بالإنجليزية: dyو ظاهري واحد على الأقل في الصف يجب أن يكون هادم الصف ظاهرياً أيضاً. بما أن نمط التابع وقت إنشائه يكون معروفاً وقت التصريف فإن البواني (وكذلك البواني الناسخة) لا يمكن أن تكون ظاهرية. على الرغم من ذلك قد تظهر بعض الحالا الصف الذي يحتوي تابعاً عضوnamic dispatch). تتيح التوابع الأعضاء الظاهرية أو "الطرق"[24] استدعف التحويل إلى نمط أكثر عمومية المسموح دائماً). تعتمد هذه الميزة على معلومات التنميط وقت التنفيذ (RTTI) (بالإنجليزية: Run-time type information). يمكن للكائنات التي يعرف المبرمج سلفاً أنها من نمط معين أن تُحول إلى ذلك النمط باستخدام المعامل static_cast الذي يتم التحقق منه وقت التصريف ولا ينطوي على أي جهد إضافي وقت التنفيذ كما أنه لا يتطلب RTTI.
التوابع الأعضاء الظاهرية
بشكل عام عندما يتجاوز تابع من صف مشتق تابعاً من صف قاعدي يحدد الإصدار الواجب استدعائه من ذلك التابع حسب نمط الكائن. يتم تجاوز تابع ما عندما لا ي

ري

إن كتابة مجزئ باستخدليه (كإعادة هيكلة الكود مثلاً). إحدى طرق التغلب على هذه الصعوبة تمكن في اختيار نحو مختلف. يمكن لبعض المجزئات] حيث يمكن استخدام المجزئ الخااء النحقيق الأكثر تحديداً من التابع المُستدعى حست التي يضطر فيها إنشاء نسخة من الكائن عند تمرير مؤشر إلى كائن مشتق كمؤشر إلى كائن قاعدي. الحل الشائع لحالة كهذه يمكن في إنشاء تابع ظاهري ()clone (أو أي اسم آخر) ينشئ ويعيد نسخةً من الصف المشتق لدى استدعائه.
يمكن للتابع العضو أن يكون "ظاهرياً صرفاً" (بالإنجليزية: pure virtual) من خلال إضافة 0= في نهاية التصريح عن التابع وقبل الفاصلة المنقوطة. يسمىب نمط الكائن وقت التنفيذ. يتم تحقيق هذا الغرض بشكل شائع في تحقيقات لغة ++C عن طريق استخدام جداول التوابع الظاهرية. يمكن تجاوز استخدام جداول التوابع الظاهرية بإضافة الاسم المؤهل الكامل للصف قبل استدعاء التابع في حال معرفة نمط الكائن إلا أن الال باسم نمط بيانات مجرد. لا يمكن إنشاء كائنات من أنماط البيانات المجردة. يمكن فقط اشتقاق أنماط البيانات المجردة. أي صف مشتق يرث تابعاً ظاهرياً صرفاً (أو أكثر) يجب أن يوفر تعريفاً غير-صرفٍ له لكي يمكن إنشاء كائنات منه. أي برنامج يحاول إنشاء كائنات من صف يحوي تابعاً ظاهرياً صرفاً أو يرث تابعاً ظاهرياً صرفاً (دون توفير تعريف غير-صرف له) هو برنامج سيئ التشكيل (بالإنجليزية: ill-formed) بالنسبة لقواعد كتابة برنامج باستخدام ++C.

تجزئة ومعالجة كود ++C المصدص به كمكتبة ++C (أو C) جاهزة للاندماج في أدوات أخرى كبيئة تطوير متكاملة مثلاً.

التوافقية

 الفعالة مثل مجزئ يسار يمين المعمم القيام بتجزئة الكود بسهولة (إلا أنها أبطأ).
إن التجزيء (بمعنى بناء شجرة نحوية) ليس أصعب المهام اللازمة لبناء أداة معالجة كود ++C. إذ يجب على أدوات كهذه الإلمام بمعاني المعرّفات المستخدمة في البرنامج تماماً كما يفعل اام إحدى خوارزميات التجزيء الكلاسيكية كخوارزمية المجزئ يسار يمين أمامي (1)LALR مهمة صعبة نسبياً[25]. يعود السبببر في بناء مصرفاتهم. إن الجانب السلبي من هذا القرار هو أن الكود الكائني الذي تنتجه المصرفات المختلفة سيكون مختلفاً وغير متوافق على الأغلب. مع ذلك كان هناك عدة محاولات لتعيير المصرفات التي تعمل على أجهزة وأنظمة تشغيل محددة (على سبيل المثال مقاربة C+بناء كافة أدوات معالجة ++C. توفر جميع المصرفات أدواتاً للتجزيء. على الرغم من أن هنالك مصرف وحيد فقط يوفر مجزئاً يتمتع بالمرونة الكافية لدمجه مع أدوات الأخرى وهو Clang[26
 في ذلك جزئياً إلى أن قواعد لغة ++C ليست في الحقيقة LALR. نتيجة ذلك يوجد عدد محدود جداً من الأدوات القادرة على معالجة الكود وإجراء تحويلات غير بديهية علمصرف. يجب على الأنظمة الفعالة التي تعالج كود ++C أن لا تقوم فقط بتجزيء النص المصدري، بل يجب عليها أيضاً أن تنسب كل معرف إلى التعريف المناسب له تماماً وفق السياق (على سبيل المثال يجب عليها أن تتعامل بشكل صحيح مع قواعد نطاقات التسمية المعقدة) كما يجب عليها أن تقرر نمط المعرف وكذلك أنماط التعابير المركبة.
أخيراً يجب أن تستطيع أداة معال
جة كود ++C التعامل مع عدد من لهجات ++C المستخدمة بشكل شائع (مثل تلك المدعومة من قبل GNU Compiler Collection و++Microsoft Visual C) وأن توفر المحللات وتحويلات الكود وإعادة توليد الكود المصدري المناسب لها. إن الدمج بين خوارزميات المتطورة مثل خوارزمية مجزئ يسار يمين المعمم مع جداول الرموز وتقنية تحويل النصوص المصدرية يتيح  تحقيق تغيير أسماء الرموز ومعالجة الاستثناءات ومزايا أخرى متعلقة بالتحقيق بهدف إعطاء منتجي المصرفات حرية أك
يواجه منتجو المصرفات صعوبات جمة في بناء مصرف متوافق بشكل كامل مع معيار ++C. فقد طبقت العديد من المصرفات لسنواتٍ كثيرة لغة ++C بمستويات متفاوتة من ناحية التوافق مع المعيار، وقد اختلفت أساليب تحقيق بعض جوانب اللغة مثل تخصيص القوالب الجزئي فيما بينها إلى درجة عالية. تدعم الإصدارات الحديثة لمعظم مصرفات ++C الشهيرة أغلبية معيار C++ 1998[27].
لم تملِ لجنة معيار ++C كيفية+ ABI [28]) على الرغم من أن أغلبها يبدو مهملاً الآن.

القوالب المُصدّeginning ANSI C يقدم المؤلف إيفور هورتون مثالاً عن كود ++C يستخدم فيه هذه الكلمة المفتاحية بحيث لا يعمل على أغلب المصرفات دون الإشارة صراحة إلى السبب في ذلك. لقد أوصى المدير السابق للجنة معيار ++C هيرب شتر إلى ضرورة إزالة هذه الكلمة المفتاحية من الإصدارات المرة

تعتبر الكلمة المفتاحية ex
غالباً ما يتمصرفان مبنيان على الواجهة الأمامية من المصرف ++EDG C. في حين لا تدعم العديد من المصرفات كـGCC هذه الميزة أساساً.port إحدى النقاط التي ساد حولها خلاف كبير. تهدف هذه الكلمة المفتاحية إلى إتاحة إمكانية فصل التصريح عن القوالب عن تعريفها. تأخر تحقيق هذه الميزة حتى عام 2003، أي بعد خمس سنوات من نشر المعيار، وكان ++Cameau C/C أول مصرف يقوم بذلك؛ خلال عام 2004 طُرحت النسخة بيتا من المصرف Borland C++ Builder X مع دعم للكلمة المفتاحية export. كلا الم الإبقاء على الكلمة المفتاحية export من أجل الاستعمال المستقبلي[30].

التوافق مع لغة C

في كتاب ++Bستقبلية لمعيار ++C بهدف حسم هذه المعضلة بشكل نهائي [29]. وبالفعل فقد قررت لجنة معيار ++C خلال اجتماعها في 10 آذار 2010 إزالة مفهوم القوالب المصدّرة بشكل كامل من المعيار C++11 إلا أنها قررت
  • اط مؤشرات أخرى في حين لا تقوم ++C بذلك (بهدف تعزيز ميزة التنميط الآمن). توجد أيضاً مشكلات في المحمولية بين اللغتين إذ تعرف لغة ++C العديد من الكلمات المفتاحية الجديدة مثل new وclass والتي يمكن استخدامها كمعرّفات (أسماء متحولات على سبيل المثال) في برنامج مكتوب بلغة C.
لقد أزيلت بعض عقبات عدم التواستخدام تقنية ربط + اعتبار لغة ++C أنها تشتمل على لغة C إلا أن هذا الاعتبار ليس تام الصحة[31]. من الممكن القيام بتصريف أغلب الكود المكتوب بلغة C ضمن ب
  • ري (بالإنجليزية: preproc
هو قيام لغة C بالتحويل ضمنياً للنمط *void يئة 99 عفي وجود بعض الاختلافات التي تجعل بعض الكود المكتوب بشكل شرعي بلغة C غير صحيح أو مختلف الأداء ضمن بيئة ++C.
أحد الاختلافات الشهيرة بين اللغتين دد المتغد ضمن مكتبة ++C القياسية، كذلك دعم C99 للمصفوفات ذات الأبعاد المتغيرة وتعريفها النمط boolean كـاسم مستعار بـtypedef في حين أنه نمط بيانات أساسي في لغة ++C، إضافة إلى إضافة الكلمة المفتاحية restrict[32]. أٌدخلت بعض ميزات C99 الجديدة في الإصدار التالي من معيار ++C وهو C++11 [33][34][35]:
  • ميزات المعالج التحضيإلى أنم+C دداً من الميزات الجديدة التي لا تدعمها لغة ++C مسببة عدم التوافق أو أنها موجودة في لغة ++C ولكن بأسلوب آخر مسببة زيادةً غير مرغوبة، على سبيل المثال تعرف C99 النمط complex المعرف بلغة ++C بالصف complex الموجومكانية الدمج بين التصاريح وبقية أجزاء الكود. في نفس الوقت أدخل المعيار Cessor) الخاص بـC99 (بما فيها الماكرو ذات الع
++C بشكل صحيح إلا أن هذا لا ينالتي تغير اسم التافقية في تنقيح معيار لغة C (المسمى C99) الذي تم عام 1999، حيث أضيفت بعض ميزات ++C إلى لغة C كالتعليقات السطرية (//) وإير من الوسطاء والعمليات الحسابية على معاملات كبيرة القيمة)
  • ()Pragma_
  • النمط long l مع كود ++C يتطلب أن يسبق تصريح أي تابع يتم التعامل معه من اللغتين معلومةً تشير إلى ضرورة استخدام C للقيام بربطه مع بقية الب*...*} "exong
  • __func__
  • الملفات الرأسية التالية:
    • csرنامج (يتم ذلك عبر استخدام {tdbool من (stdbool.h)
    • cstdint من (stdint.h)
    • cinttypes من (inttypes.h)
إن دمج كود Ctern "C) تفادياً لابع (بهدف تمييز التوابع المحملة بشكل زائد عن بعضها).

لا يوجد تعليقات

شاركنا الرائ

يتم التشغيل بواسطة Blogger.

المشاركات الشائعة