توابع دوست و کلاس های دوست در ++C — راهنمای جامع
در این مقاله با شیوه ایجاد توابع دوست و کلاسهای دوست در ++C آشنا میشویم و از آنها به طرز مؤثری در برنامههای خود استفاده میکنیم. یکی از مهمترین مفاهیم برنامهنویسی شیءگرا بحث پنهانسازی دادهها است. بدین ترتیب تابعهای غیر عضو نمیتوانند به دادههای خصوصی یا حفاظتشده شیء دسترسی پیدا کنند. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی روی لینک زیر کلیک کنید:
اما گاهی اوقات این محدودیت برنامهنویس را مجبور میکند تا کدهای طولانی و پیچیدهای بنویسد. بنابراین یک مکانیسم داخلی در برنامهنویسی ++C تعبیه شده است تا بتوان از تابعهای غیر عضو نیز به دادههای خصوصی و حفاظتشده دسترسی یافت. این کار با استفاده از «تابع دوست» یا «کلاس دوست» انجام میپذیرد.
تابع دوست در ++C
اگر تابعی به صورت تابع دوست تعریف شده باشد، در این صورت دادههای خصوصی و حفاظتشده یک کلاس میتوانند از سوی این تابع مورد دسترسی قرار گیرند. کامپایلر از روی کلیدواژه friend میفهمد که تابع مفروض یک تابع دوست است. برای دسترسی به دادهها، اعلان یک تابع دوست باید درون بدنه کلاس (هر جایی در کلاس از جمله درون بخش خصوصی یا عمومی میتواند باشد) و با کلیدواژه friend صورت بگیرد.
اعلان تابع دوست در ++C
1class class_name
2{
3 ... .. ...
4 friend return_type function_name(argument/s);
5 ... .. ...
6}
اکنون میتوانید تابع دوست را به صورت یک تابع نرمال برای دسترسی به دادههای یک کلاس تعریف کنید. هیچ کلیدواژه friend در این تعریف استفاده نشده است.
1class className
2{
3 ... .. ...
4 friend return_type functionName(argument/s);
5 ... .. ...
6}
7
8return_type functionName(argument/s)
9{
10 ... .. ...
11 // Private and protected data of className can be accessed from
12 // this function because it is a friend function of className.
13 ... .. ...
14}
مثال 1: کار با تابع دوست
1/* C++ program to demonstrate the working of friend function.*/
2#include <iostream>
3using namespace std;
4class Distance
5{
6 private:
7 int meter;
8 public:
9 Distance(): meter(0) { }
10 //friend function
11 friend int addFive(Distance);
12};
13// friend function definition
14int addFive(Distance d)
15{
16 //accessing private data from non-member function
17 d.meter += 5;
18 return d.meter;
19}
20int main()
21{
22 Distance D;
23 cout<<"Distance: "<< addFive(D);
24 return 0;
25}
خروجی
Distance: 5
در اینجا تابع دوست ()addFive درون کلاس Distance اعلان شده است. از این رو دادههای خصوصی meter میتوانند از این تابع مورد دسترسی قرار گیرند. با این که مثال فوق ایدهای در مورد مفهم یک تابع دوست در اختیار ما قرار میدهد، اما این کاربرد معنیداری محسوب نمیشود. کاربرد معنیدارتر تابع دوست در زمانی است که بخواهید روی اشیایی از دو کلاس متفاوت عمل کنید. در اینجا تابع دوست میتواند کاملاً مفید واقع شود. البته بدیهی است که میتوانید روی دو شیء با کلاسهای مختلف بدون استفاده از تابع دوست نیز عملیاتی اجرا کنید، اما در این صورت برنامه طولانی و پیچیده میشود و درک آن دشوار خواهد بود.
مثال 2: افزودن اعضا به 2 کلاس متفاوت با تابع دوست
1#include <iostream>
2using namespace std;
3// forward declaration
4class B;
5class A {
6 private:
7 int numA;
8 public:
9 A(): numA(12) { }
10 // friend function declaration
11 friend int add(A, B);
12};
13class B {
14 private:
15 int numB;
16 public:
17 B(): numB(1) { }
18 // friend function declaration
19 friend int add(A , B);
20};
21// Function add() is the friend function of classes A and B
22// that accesses the member variables numA and numB
23int add(A objectA, B objectB)
24{
25 return (objectA.numA + objectB.numB);
26}
27int main()
28{
29 A objectA;
30 B objectB;
31 cout<<"Sum: "<< add(objectA, objectB);
32 return 0;
33}
خروجی
Sum: 13
در این برنامه کلاسهای A و B اقدام به اعلام ()add به عنوان یک تابع دوست کردهاند. از این رو این تابع میتواند به دادههای خصوصی هر دو کلاس دسترسی داشته باشد. در اینجا تابع ()add دادههای خصوصی numA و numb از دو شیء objectA و objectB را جمع میکند و نتیجه را به تابع اصلی بازمیگرداند. برای این که برنامه به درستی کار کند، یک اعلان رو به جلو از کلاس class B باید مطابق مثال فوق انجام یابد. دلیل این امر آن است که class B درون class A با استفاده از کد زیر ارجاع یافته است:
1friend int add(A, B);
کلاس دوست در برنامهنویسی ++C
به صورتی مشابه تابع دوست، یک کلاس نیز میتواند با استفاده از کلیدواژه friend به صورت دوست یک کلاس دیگر تعریف شود. به مثال زیر توجه کنید:
1... .. ...
2class B;
3class A
4{
5 // class B is a friend class of class A
6 friend class B;
7 ... .. ...
8}
9
10class B
11{
12 ... .. ...
13}
زمانی که یک کلاس به صورت کلاس دوست درآید، همه تابعهای عضو آن کلاس به صورت تابع دوست درمیآیند. در این برنامه همه تابعهای عضو class B به صورت تابعهای دوست class A خواهند بود. از این رو هر تابع عضو کلاس B میتواند به دادههای خصوصی و حفاظتشده کلاس B دسترسی داشته باشد. اما تابعهای عضو کلاس A نمیتوانند به دادههای کلاس B دسترسی داشته باشند. به خاطر داشته باشید که رابطه دوستی در ++C رابطهای یکطرفه است، یعنی تنها اعطا میشود و اخذ نمیشود. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C++
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- ارسال آرایه به یک تابع در ++C — راهنمای جامع
- تابع های ++C — به زبان ساده
==
خیلی ممنون به کارم اومد