PDA

View Full Version : کمک---ارجاع به تابع



f_cpuf
دوشنبه 27 اردیبهشت 1389, 16:42 عصر
دوستان این کد را ببینید:

#include<iostream.h>
int &f(int &x)
{
cout<<"X="<<x<<endl;
x*=3;
cout<<"X="<<x<<endl;
return x;
}
main(){
int m=11;
cout<<"M="<<m<<endl;
int n=f(m);
cout<<"M="<<m<<endl;
cout<<"N="<<n<<endl;

cout<<"\nF="<<(f(n)=44)<<endl;
cout<<"M="<<m<<endl;
cout<<"N="<<n<<endl;
}این برنامه چطوری کار میکنه؟
میشه توضیح بدید که چرا در آخر n=44 میشه؟
یا اصلا تابع f نام دومی برای x میشود یا n ؟
ممنون میشم اگر راهنمایی کنید.

sh4mid
دوشنبه 27 اردیبهشت 1389, 17:51 عصر
سلام

این برنامه چطوری کار میکنهبگذار اول یک نگاهی به مفهوم reference بندازیم
به کد زیر نگاه کن



int i=0;
int& p_i=i;

cout<<" i:"<<i<<endl;
cout<<"p_i:"<<p_i<<endl;

i=2;

cout<<" i:"<<i<<endl;
cout<<"p_i:"<<p_i<<endl;

p_i=7;

cout<<" i:"<<i<<endl;
cout<<"p_i:"<<p_i<<endl;
اومدیم متغیر i رو از نوع int و متغیر p_i رو از نوع reference از نوع int تعریف کرذیم و اون رو برابر i قرار داده ایم ، خوب حالا تغییر در مقدار هرکدوم از اونها باعث تغییر در مقدار اون یکی میشه می تونی فرض کنی اونها هر دو یکی هستند با اسم های مختلف
حالا بریم سر وقت تابع



int& f(int& x)
{
x*=3;
return x;
}

تابع f مقدار X رو می گیره 3 برابرش می کنه، فراخوانی X از نوع reference هست یعنی این



int n=1;
cout<<n; //OUTPUT IS 1
cout<<f(n);//OUTPUT IS 3
cout<<n; //OUTPUT IS 3

مقدار n بعد از فراخوانی عوض شده،تابع بجای برگردوندن یک مقدار یه Reference برمی گردونه
یعنی میتونی از تابع به عنوان یه l-value استفاده کنی و مثلا بنویسی
f(n)=44
که در حالت عادی Error می ده
اینجا چون هم n بصورت reference هست هم خروجی تابع شما میتونی بگی وقتی ما مقدارشو برابر 44 می گذاریم انگار مقدار n رو برابر 44 گذاشتیم
اگه فراخوانی n عادی بود مقدارش بعد از فراخوانی f(n)=44 عوض نمیشد
حالا اصلا به چه دردی می خوره؟


برای overload عملگرهای << و >> تو class
برای overload عملگر[] تو class
و...