سؤال

أحتاج إلى تعلم C ++ من أجل تعلم بناء تطبيق Nokia WRT و أو Maemo. أحتاج إلى معرفة ما gotchas وما هو جانب C ++ الذي أحتاجه/يجب أن أتعلمه أو التركيز أكثر. شيء واحد أخطرته في ذهني هو أن C ++ ليس لديه جامع القمامة. لذلك ، أحتاج إلى التركيز على النوع المتغير. ولكن ، هل هناك أي شخص آخر مهم حقًا ولا يمكنني تجاهله؟

هل كانت مفيدة؟

المحلول

تتمثل Main Gotcha في محاولة تصور C ++ من حيث كيفية اختلافها عن PHP أو Java.

آسف ، إنه لا يعمل هكذا. يختلف C ++ عن تلك اللغات في كل احترام مهم تقريبًا خارج بناء الجملة للحساب. في بعض الأحيان تكون الاختلافات خفية. تحتاج إلى تعلمه جديدًا ، ولا تعتقد أن شيئًا مناسبًا للقيام به في PHP أو Java سيعمل بشكل جيد لك في C ++.

ومع ذلك ، تشمل الصعوبات الشائعة:

  • إدارة الموارد: RAII ؛ تنفيذ منشئي النسخ والمدمرين و operator=; ؛ تجنب الاضطرار إلى تنفيذ ctors ، dtors ، المشغل =.
  • فهم المراجع والمؤشرات والقيم والمتغيرات التلقائية.
  • تجنب السلوك غير المحدد (myarray[i] = i++; هو المفضل). يعد كل من PHP و Java لغات محددة "بإحكام" أكثر من C ++: أولاً من المرجح أن يتم تعريف سلوك البرنامج وبالتالي موثوق به. لهذا السبب ، فإن التطبيقات المنفصلة تشبه أكثر من تطبيقات C ++. من السهل جدًا كتابة برنامج في C ++ لا يفعل الشيء الخاطئ فحسب ، بل إنه يفعل أشياء مختلفة بشكل كبير في أشواط مختلفة ، بما في ذلك التصادم ، والبيانات الفاسدة ، إلخ.
  • تعلم استخدام القوالب بأمان وفعالية ، والميراث المتعدد ، وحمل المشغل ، وغيرها من الميزات التي لا تعرفها.
  • التعابير الصحيحة لرمي الاستثناءات والقبض عليها (رمي بالقيمة ، والقبض بالرجوع إليها ، لا تخرج من المدمر).
  • كتابة التعليمات البرمجية المحمولة (فهم الفرق بين الضمانات المعيارية ، وما هو غير مضمون ولكن تنفيذك يحدث. السلوك المعرفة من قبل التنفيذ مثل أحجام الأنواع الأساسية).
  • المكتبات القياسية لـ C ++ محدودة مقارنة بـ Java أو PHP. سوف تستخدم المكتبات غير القياسية كذلك. على سبيل المثال ، يستخدم Maemo GTK+ و/أو QT. غالبًا ما تكون الإجابة على "كيف يمكنني القيام بـ X في C ++" ، "لا يمكنك القيام بذلك باستخدام C ++ القياسي فقط ، فأنت بحاجة إلى واجهات برمجة تطبيقات خاصة بالنظام الأساسي أو مكتبة محمولة تم تجميعها لنظامك". يمكن أن تكون x رسومات ، مآخذ ، تعبيرات منتظمة ، متعددة الخيوط ، معالجة XML ، التشفير. خاصة مع منصات المحمول ، تحتاج إلى مراقبة إصدارات نظام التشغيل ، يمكن أن تتغير الأمور وستتغير تحتك من وقت لآخر.

نصائح أخرى

تعلم كيفية استخدام حاويات STL على الفور. على الرغم من أن بناء جملة التكرار ليس ودودًا للأشخاص القادمين من لغات أخرى ، إلا أنه يمنحك هياكل البيانات المبنية التي تستخدمها عمومًا في مجموعات Java أو PHP كمصممة ، (الخرائط/التجزئة ، القوائم ، المداخن ، المتجهات) دون كتابة رمز مؤشر غير تقليدي مع التخصيص الديناميكي الذي غالباً ما يتجنب المبتدئين في إعادة اختراع العجلة والعبث مع بق الحشرات الذاكرة.

أيضًا ، إذا قمت بكتابة رمز معين من النظام الأساسي (تطبيق QT أو Microsoft MFC ، على سبيل المثال) ، فسترى غالبًا أمثلة باستخدام حاويات Framework حيث ستكون STL خيارًا أكثر حكمة. يمكن أن يملأ STL (و BOOST) الثغرات. لا يعني استخدام إطار عمل واجهة المستخدم الرسومية أن عليك استخدام كل ما يقدمه الإطار. ابتعد عن الحاويات غير القياسية إلا إذا كنت تعرف دون ظل شك ، فلن تقوم أبدًا بتنفيذ البرنامج أو إعادة استخدام أجزاء من الكود.

أود أن أقول إنه ليس نوعًا متغيرًا ، بقدر التأكد من تنظيف ذاكرتك. ستقوم Java بتنظيف ذاكرتك ، لكن C ++ لن يفعل ذلك من أجلك. خلاف ذلك ، فإن إدارة مواردك في وجود استثناءات أمر مهم.

على الجانب الإيجابي ، ستحصل على ما يسمونه "الانتهاء الحتمي". فائدة كبيرة. ابحث عن ، كاختصار ، "Raii". أعتقد أنه يمكن القول أنه أحد أهم التعابير في C ++.

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

واحد من Gotcha رأيت بعض مبرمجي Java يصنعها عندما يكون الانتقال إلى C ++ هو تسرب الذاكرة "Try-Catch". فمثلا:

try {
  myType pVar = new myType();
  DoSomething(pVar);
  delete pVar;
}
catch (exception) {
  cout << "Doh!  Something failed!" << endl;
}

في الحالة المذكورة أعلاه ، إذا كانت طريقة "dosomething () تلقي استثناءً ، فلن يتم حذف PVAR أبدًا ، لذلك سيكون هناك تسرب للذاكرة.

(تشمل الحلول لهذا: إعلان جميع المتغيرات قبل المحاولة/الكتل ، أو باستخدام Auto_PTR ، أو مجرد تجنب المحاولة لتبدأ!)

أهم شيء (في رأيي) هو أن كل شيء هو نوع قيمة ، لذلك إذا قمت بتمرير صفيف في وظيفة مثل هذه:

void do_stuff(std::vector<int> my_array)
{
  ...
}

ثم my_array الذي تم تمريره هو أ ينسخ من الحجة المحددة. إن نسخ مجموعة كاملة مثل هذا مكلفة ، لذلك بشكل عام ، تريد أن تمر عبر المرجعية:

void do_stuff(const std::vector<int>& my_array) 
{
  ...
}

(ملاحظة: حذف const إذا كنت تريد تعديل الأصل my_array).

أشعر بالفضول حول سبب اعتبار "PHP/Java" شيئًا واحدًا هنا. ليس كذلك.

  • انتقال Java-> C ++ كبير إلى حد ما ولكنه قابل للتنفيذ ، عليك فقط أن تتعلم الكثير من بناء الجملة الإضافي ، وبعض المفاهيم الإضافية مثل المدمرات ، ومركبات النسخ ، وتقطيع الكائنات ، والحمل الزائد للمشغل ، والتواصل مع مكتبة C ++ .
  • إن انتقال PHP-> C ++ من ناحية أخرى هو ترتيب آخر من حيث الحجم أكبر ، لأنه يتعلق (أ) لغة مصدر سيئة المعرفة للغاية ، (ب) لغة تعتمد على القالب بدلاً من الفئة ، و (C ) لغة تنفذ في بيئة خاصة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top