سؤال

أنا فقط أتعلم C ++ ، وأتي من C ، بعض مكالمات الوظائف التي أراها في الكتاب تربكني:

char a;
cin.get(a);

في C ، لا يمكن أن ينجح هذا ، إذا فعلت ذلك ، فلن تكون هناك طريقة للحصول على الإخراج ، لأنك تمر بالقيمة ، وليس بالرجوع إليها ، لماذا يعمل هذا في C ++؟ هل الإشارة و dereferning مصنوعة ضمنية (يعرف المترجم أن CIN.GET يحتاج إلى مؤشر ، لذلك يتم الرجوع إليه)؟

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

المحلول

C ++

هذا من شأنه أن يعمل في C ++ لأن توقيع الوظيفة ل get() ربما هذا:

void get(char& a); // pass-by-reference

ال & رمز بعد char يدل على المترجم أكثر من عندما تمر في char القيمة ، يجب أن تمر في المرجعي إلى char بدلا من صنع نسخة منه.

ما يعنيه هذا أساسًا هو أن أي تغييرات تم إجراؤها في الداخل get() سوف تنعكس في قيمة a خارج الطريقة.

إذا كان توقيع الوظيفة ل get() كان هذا:

void get(char a); // pass-by-value

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

ج

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

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}

سيؤدي تشغيل هذا البرنامج إلى إخراج:

g

نصائح أخرى

الأنواع المرجعية تعمل من هذا القبيل (تمر بالرجوع إليها ، بدلاً من المرور حسب القيمة). إنه مشابه لتمرير مؤشر (تمرير بواسطة مؤشر) في C ، ولكن مع بناء جملة أجمل ومزيد من السلامة (الشيكات وقت الترجمة). يمر التنفيذ بواسطة المؤشر داخليًا.

يسمح C ++ بالمرجع (لاحظ &, ، وهو ما يدل على استخدام المرجع):

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}

هذا هو السبب في أن بعض مبرمجي C ++ لا يحبون استخدام مراجع من هذا القبيل.
يبدو وكأنه جدال الوظيفة - ليس لديك أدنى فكرة عن بناء الجملة سواء تم تعديل "A" أم لا.

تفضل تمرير مراجع Const (عندما يكون لديك كائن كبير وستكون نسخة مكلفة) وإعادة المراجع أو أفضل ما في كل شيء.

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