سؤال

ممكن مكررة:
الفرق بين مؤشر متغير متغير إشارة في C++

متى يجب أن تعلن بلدي المتغيرات كما مؤشرات مقابل الكائنات تنتقل عن طريق مرجع ؟ فإنها تجمع إلى نفس الشيء في الجمعية (على الأقل وقت التشغيل مقارب) حتى متى يجب أن أستخدم ؟

void foo(obj* param)
void foo(obj& param)
هل كانت مفيدة؟

المحلول

بلدي القاعدة بسيطة:استخدام * عندما تريد أن تظهر أن قيمة اختيارية وبالتالي يمكن أن يكون 0.

باستثناء من هذه القاعدة:كل _obj_s حول يتم تخزينها في حاويات كنت لا تريد أن تجعل النظام الخاص بك رمز تبدو قبيحة باستخدام كل مكان foo(*value); بدلا من foo(value); ثم حتى تظهر هذه القيمة لا يمكن أن يكون 0 وضع assert(value); في وظيفة تبدأ.

نصائح أخرى

أنا متابعة جوجل دليل نمط قياسي كما هو الأمر الأكثر منطقية بالنسبة لي.وتقول:

في وظيفة معلمة قوائم جميع يجب أن تكون المراجع const:

void Foo(const string &in, string *out);

في واقع الأمر هو قوي جدا الاتفاقية في مدونة جوجل أن وسائط الإدخال هي قيم أو const المراجع حين إخراج حجج مؤشرات.المدخلات المعلمات قد يكون const المؤشرات ، ولكن نحن لا تسمح مرجع غير const المعلمات.

حالة واحدة عندما كنت قد ترغب في إدخال المعلمة أن تكون const المؤشر إذا كنت ترغب في التأكيد على أن الحجة ليست نسخ, لذلك يجب أن توجد لعمر الكائن ؛ فمن الأفضل عادة هذه الوثيقة في التعليقات أيضا.المحكمة الخاصة بلبنان محولات مثل bind2nd و mem_fun لا تسمح إشارة المعلمات ، لذلك يجب إعلان وظائف مع المؤشر المعلمات في هذه الحالات أيضا.

سبب واحد لاستخدام المؤشرات هو ما إذا كان من المنطقي أن تمر NULL القيمة في وظيفة.مع مؤشر ، فمن المتوقع أن تكون قادرة على القيام بذلك.مع إشارة ، فمن غير المتوقع أن تكون قادرة على القيام بذلك.

(ومع ذلك ، عن طريق القيام صعبة الأشياء فإنه لا يزال من الممكن تمرير NULL في إشارة المعلمة.هل يمكن أن نتوقع أن يسمى وظيفة قد تحطم في هذه الحالة.)

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

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

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

الشيء نفسه ينطبق على "0" أو "لاغية".أنا أفضل استخدام "NULL", هذه الطريقة 3 أشهر في وقت لاحق عندما أرى رمز التي تبدو مثل:

somevar_1 = 0;
somevar_2 = NULL;

وأنا أعلم أن somevar_1 هو int (أو float) ، somevar_2 هو نوع من المؤشر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top