توابع دوست کلاس (Friend) در سی پلاس پلاس(بخش اول)
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش توابع دوست کلاس (Friend) در سی پلاس پلاس:
در این جلسه میخواهیم در مورد توابع دوست کلاس در زبان ++C توضیح دهیم. شاید مبحثی که در زبانهای دیگر خیلی کمتر به آن پرداخته شده و در زبان سی پلاس پلاس بسیار قدرتمند میتواند به ما کمک دهد تا با کلاسها کار کنیم. خیلی وقتها اتفاق افتاده که شما نیاز دارید برای ارتباط دادن بین چندین کلاس از این توابع استفاده کنید. در جلسات قبل گفتیم اعضای خصوصی کلاس قابل دسترسی توسط اشیا نیستند، یعنی بیرون از کلاس نمیتوانیم به آنها دسترسی داشته باشیم که این یکی از محدودیتهای بزرگ اعضای خصوصی کلاس میباشد. به همین خاطر یک متد عمومی تعریف میکردیم و میتوانستیم از طریق آن به عضو خصوصی دسترسی داشته باشیم. برای درک بهتر این مبحث به مثال زیر توجه کنید:
فرض کنید در یک اداره رئیس را به عنوان عضو خصوصی و کارمندها را عضو عمومی در نظر بگیریم. میخواهیم یک نامه به رئیس بدهیم اما چون مستقیما نمیتوانیم رئیس را ببینیم چارهایی نداریم که از طریق کارمندها نامه را به رئیس برسانیم. در این صورت ما وابسته به یکی از اعضای عمومی کلاس هستیم. اما حالا فرض کنید یکی از دوستان رئیس را میشناسیم دیگر برای تحویل نامه نیاز نیست از طریق کارمندها این کار را انجام دهیم و هرجا که نیاز داشته باشیم میتوانیم نامه را به آن دوست بدهیم تا به رئیس برساند. با این کار میتوانیم به راحتی به اعضای خصوصی دسترسی داشته باشیم. تابع دوست کلاس مانند دوست رویس در این مثال میباشد که برای دسترسی به اعضای خصوصی دیگر نیازی نیست وارد کلاس شویم. توابع دوست عضو کلاس نیستند در واقع تابعی است که دوست کلاس میباشد و میتوانیم از طریق آن به اعضای خصوصی کلاس دسترسی داشته باشیم. حتی قدرتمندتر از اعضای عمومی. اما درون کلاس آنها را میشناسند و با آنها در ارتباط هستند.
مثال: در این برنامه برای دسترسی به اعضای خصوصی از تابع دوست استفاده میکنیم. تابع دوست را بیرون از کلاس تعریف میکنیم. تابع sum در این برنامه یک تابع دوست است که کار آن این است که دو نمونه از کلاس test را جمع کند. دو شی را از کلاس test با نامهای test1 و test2 تعریف و مقداردهی میکنیم. برای تابع دوست، یک پیش الگو از تابع sum اولین خط کلاس خود قرار میدهیم و ابتدا تابع از کلمه کلیدی friend استفاده میکنیم. وقتی تابعی دوست یک کلاس است اشیا آن میتواند به اعضای خصوصی خودشان دسترسی داشته باشند. در این برنامه t1,t2,temp میتوانند به اعضای خصوصی خود دسترسی داشته باشند.
class Test
{
friend Test sum(Test t1 ,Test t2)
private :
int num1 , num2;
public:
Test ()
{
}
Test(int a , int b)
{
num1=a;
num2=b;
}
void Print()
{
cout<<”Num1 :” <<num1<<”\t Num2 :”<<num2<<endl;
}
} ;
Test sum(Test t1 , Test t2)
{
Test temp;
Temp.num1= t1.num1 + t2.num1;
Temp.num2= t1.num2 + t2.num2;
return temp;
}
int main()
{
Test test1(10,20);
Test test2(100,200);
Test Temp= Sum(test1 , test2);
Temp.Print();
}
خروجی:
مثال: در این برنامه 3 نمونه از کلاس test را ضرب میکند.
نکته: یکی از ارزشهای توابع دوست این است که میتوانیم به آنها ورودی از جنس کلاس با هر تعدادی بدهیم. اما نمیتوانیم داخل یک کلاس تابعی تعریف کنیم که چندین ورودی از جنس خودش داشته باشد. در این برنامه تابع mul که یک تابع دوست میباشد دارای 3 ورودی از جنس کلاس test میباشد.
class Test
{
friend Test mul(Test t1 , Test t2 , Test t3)
private :
int num1 , num2;
public:
Test ()
{
}
Test(int a , int b)
{
num1=a;
num2=b;
}
void Print()
{
cout<<”Num1 :” <<num1<<”\t Num2 :”<<num2<<endl;
}
} ;
Test Mul(Test t1 , Test t2 , Test t3)
{
Test temp;
Temp.num1= t1.num1 * t2.num1 * t3.num1;
Temp.num2= t1.num2 * t2.num2 * t3.num2;
return temp;
}
int main()
{
Test test1(2,4);
Test test2(5,8);
Test test2(1,3);
Test Temp= Mul(t1 , t2 , t3);
Temp.Print();
}
خروجی:
مثال: در این برنامه می خواهیم این فرمول (num1+x)-(num2*z)+y را با استفاده از تابع دوست کلاس پیاده سازی کنیم.
class Test;
class MyClass
{
friend int Fun(Test t1,MyClass m1)
private:
Int x,y,z;
public:
MyClass(int a , int b, int c)
{
x=a;
y=b;
z=c;
}
void Print()
{
cout<<”X :” <<x<<”\t Y :”<<y<<”\t Z :”<<z<<endl;
}
};
class Test
{
friend int Fun(Test t1,MyClass m1)
private :
int num1 , num2;
public:
Test ()
{
}
Test(int a , int b)
{
num1=a;
num2=b;
}
void Print()
{
cout<<”Num1 :” <<num1<<”\t Num2 :”<<num2<<endl;
}
} ;
int Fun(Test t1,MyClass m1)
{
int temp=(t1.num1 + m1.x)-(t1.num2 * m1.z)+m1.y;
return temp;
}
int main()
{
Test test1(2,3);
MyClass myClass1(5,6,7);
test1.Print();
myClass1.Print();
cout<<”Result is :”<<Fun(test1,myClass1);
}
خروجی:
دوست درسمنی عزیز، امیدواریم از این آموزش لذت برده باشید.
برای یادگیری این مبحث میتوانید این درس را تهیه کنید و از فایلها و ویدئو این بخش استفاده کنید.
شما عزیزان میتوانید سوالات خود را در بخش انجمن پرسش و پاسخ مطرح کنید و همچنین منتظر انتقادات و پیشنهادات مفید شما در بخش نظرات هستیم تا ما را در کیفیت بهتر آموزشهایمان یاری کنید.
با امید موفقیت و شادی برای شما دوست درسمنی عزیز
انجمن++C کاران درسمن
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.