موسسه خیریه محک

شهر ریاضی بازی-ریاضی

برگرداندن ارجاع (رفرنس) از درون تابع

0 امتیاز
905 نمایش

شنیده بودم که برگردوندن یک ارجاع به یه متغیر که داخل تابع تعریف بشه (متغیر محلی) کار اشتباهیه چون متغیر محلی با اتمام تابع از بین می‌ره. اما من برنامه‌ی زیر و نوشتم

int& f()
{
  int x = 10;
  return x;
}
int main()
{
  cout<<f();
}

برنامه مقدار درست ۱۰ رو چاپ کرد و هیچی هم از دست نرفته بود. چرا استفاده از ارجاع برگشتی به این صورت نادرسته پس؟

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده دوشنبه ۳۰ اردیبهشت ۱۳۹۲ در C++ توسط prodo  

1 پاسخ

0 امتیاز

وقتی یه تابع یه متغیر محلی تعریف می‌کنه اون متغیر داخل حافظه‌ی پشته (stack) تعریف می‌شه و صاحبش هم اون تابع تعریف می‌شه برای برنامه. حالا وقتی اجرای تابع خاتمه پیدا کنه، در حقیقت صاحب اون متغیر محلی از بین می‌ره ولی مقدارش داخل اون آدرس باقی می‌مونه.
دو حالت ممکنه رخ بده. هنگامی که دستور cout<<f() اجرا می‌شه، قبلش هیچ عملی که مقدار داخل اون آدرس خاص رو تغییر بده اجرا نشده که می‌شه مثل همین مثال شما. دسترسی به یه آدرس که قبلاً مقداری توش بوده.
حالت بعدی هم این هست که بین اجرای تابع و cout<<f() اتفاقی افتاده باشه که مقدار داخل اون آدرس عوض شده باشه. در این حالت برنامه‌ی شما درست جواب نمی‌ده.

اشکال برگردوندن ارجاع اینه که نمی‌تونیم مطمئن باشیم تا موقع استفاده از مقدار داخل آدرس، هیچ کد دیگه‌ای در کامپیوتر اون قسمت و تغییر نمی‌ده. بنابراین در حالت‌هایی ممکنه اون قسمت تغییر کنه و مقداری که ما ازش انتظار داریم به ما برنگردونه.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده دوشنبه ۳۰ اردیبهشت ۱۳۹۲ توسط prodo