اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

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

تفاوت فراخوانی تابع از طریق اشاره‌گر با ارجاع (رفرنس) چیست؟

+2 امتیاز
2,628 نمایش
برنامه‌ای که تست نشده کار نخواهد کرد (Stroustrup, Bjarne)
پرسیده شده یکشنبه ۲۸ آبان ۱۳۹۱ در C++ توسط CPP_Crawler3  
بازتگ شده چهارشنبه ۲۱ فروردین ۱۳۹۲ توسط admin

2 پاسخ

+1 امتیاز
 
بهترین پاسخ

تفاوت‌های عمده:
حالت‌هایی پایه‌ای

۱) ارجاع (رفرنس) نمی‌تونه null باشه ولی اشاره‌گر می‌تونه. بنابراین اگه می‌خواین حالت null رو هم پشتیبانی کنین از اشاره‌گر استفاده کنین. مثلاً در حالتی که مقدار پیش‌فرض null دارین:

int f(int *p = null);

۲) ارجاع نمی‌تونه در تابع دستکاری بشه اما اشاره‌گر می‌تونه:

int f(int *p)
{
  p++;
}

که البته در این حالت اگه آرگومان const pointer باشه می‌تونین از ارجاع استفاده کنین.

۳) عملیات ریاضی روی اشاره‌گر قابل اجراست مثلاً

int f(int *p1, int *p2)
{
  if(p1 < p2) ...
}

که البته این کار توسط ارجاع هم قابل پیاده‌سازی هست که البته با اشاره‌گر راحت‌تره.

به جز این سه مورد استفاده از اشاره‌گر مزیتی نسبت به ارجاع نداره.

حالت‌های پیچیده‌تر

یه مورد پیچیده‌تر هست که یک اشاره‌گر با نوع پویا (دینامیک) داشته باشیم. یعنی فرض کنیم کلاس P والد و کلاس C فرزند باشه و یه اشاره‌گر به والد رو به تابع بفرستیم که قراره در تابع به یک شی از نوع فرزند اشاره کنه. در این حالت استفاده از ارجاع برای چنین کاری انتخاب خوبی نیست.

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

یک تفاوتش اینه که در فراخوانی با ارجاع، رفرنس نمیتونه NULL باشه.
اگر میخواین همچین محدودیتی برای آرگومان‌ تابع داشته باشید، رفرنس توصیه میشه.

پاسخ داده شده دوشنبه ۹ بهمن ۱۳۹۱ توسط CPP_Crawler4  

محدودیت؟!