سؤال

الأسماء لها مجال (خاصية وقت الترجمة) ، في حين أن الكائنات لديها مدى الحياة (خاصية وقت التشغيل). حق؟

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

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

المحلول

الأسماء لها نطاق (خاصية وقت الترجمة) ،

نعم. لن أسميها فكرة خاصية. ولكن في الأساس نعم.

في حين أن الكائنات لها عمر (خاصية وقت التشغيل). حق؟

هناك ثلاثة أنواع من المتغيرات. كل نوع له خصائص مختلفة فيما يتعلق بعمر.

  • مدة التخزين التلقائية:
  • مدة تخزين ثابت
  • مدة التخزين الديناميكية

ملاحظة: تحتوي كائنات مدة التخزين التلقائية على عمر مرتبط بنطاق المتغير.

غالبًا ما أرى أشخاصًا يتحدثون عن الأشياء المؤقتة "الخروج من النطاق".

ما لم يتم تدمير متغير مؤقت في نهاية التعبير. إذا كانت مرتبطة بمتغير (مرجع const) ، فسيكون لديهم نفس عمر المتغير. في بعض الأحيان يكون من الأسهل الرجوع إلى هذا النطاق ، ولكن من الناحية الفنية أنت محق.

ولكن نظرًا لأن الكائن المؤقت ليس له اسم ، أعتقد أنه ليس من المنطقي التحدث عن "النطاق" في هذا السياق.

من الناحية الفنية. لكنني أعتقد أن الأمر يجعل الحديث عنه أسهل. بالنسبة لي (وإن لم يكن صحيحًا تقنيًا) ، فإن نطاق مؤقت (غير ملزم) هو التعبير. من الأسهل قوله من عمر المتغير المؤقت.

يتم تعريف عمر كائن مؤقت بشكل واضح للغاية وليس له علاقة مع النطاق. هل توافق؟

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

نصائح أخرى

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

نظرًا لأنك تتحدث عن استخدام المصطلح للتواصل مع الآخرين ، فإن هذا التواصل هو المهم حقًا. إذا كنت تحدد المصطلحات عن طريق كتابة وثيقة قياسية أو تحاول تفسير مثل هذا المستند في سياق المصطلحات المحددة ، فسيكون الموقف مختلفًا. إن تفسير ISO 14882 ، بالطبع ، يتضمن التواصل مع الآخرين ، لذلك يجب عليك فقط أن تطلب التوضيح إذا لزم الأمر ، في هذه الحالة.

من المنتظم أن يكون كل التواصل غير المعدني معيارًا ، وغالبًا ما يكون من الأفضل استخدام التعليمات البرمجية في أيضاً حالة عندما تكون الدقة العالية مطلوبة. يستخدم معيار C ++ على نطاق واسع الأمثلة لهذا السبب.

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

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

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

f(Foo(), Bar());

يتعين على المترجم أن يشير إلى واحد على الأقل من المنشرين على الرغم من أنك كمبرمج لا يمكن أن تشير إلى أي منهما. الأشياء المؤقتة لها نطاق.

يمتد الارتباط بمرجع const مدى عمر مؤقت إلى عمر المرجع ، لذلك بمعنى ما ، هو يفعل لها علاقة مع النطاق في هذه الحالة بالذات:

std::string foo();

int main()
{
    // Lifetime of the temporary returned by foo is indeed the scope of bar
    const std::string &bar = foo();
}

نرى هذه المقالة من Herb Sutter:

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

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