برنامه نویسی ۳۶۰۲ بازدید

در این مقاله با شیوه ایجاد توابع دوست و کلاس‌های دوست در ++C آشنا می‌شویم و از آن‌ها به طرز مؤثری در برنامه‌های خود استفاده می‌کنیم. یکی از مهم‌ترین مفاهیم برنامه‌نویسی شیءگرا بحث پنهان‌سازی داده‌ها است. بدین ترتیب تابع‌های غیر عضو نمی‌توانند به داده‌های خصوصی یا حفاظت‌شده شیء دسترسی پیدا کنند. برای مطالعه بخش قبلی این مجموعه مقالات‌ آموزشی روی لینک زیر کلیک کنید:

اما گاهی اوقات این محدودیت برنامه‌نویس را مجبور می‌کند تا کدهای طولانی و پیچیده‌ای بنویسد. بنابراین یک مکانیسم داخلی در برنامه‌نویسی ++C تعبیه شده است تا بتوان از تابع‌های غیر عضو نیز به داده‌های خصوصی و حفاظت‌شده دسترسی یافت. این کار با استفاده از «تابع دوست» یا «کلاس دوست» انجام می‌پذیرد.

تابع دوست در ++C

اگر تابعی به صورت تابع دوست تعریف شده باشد، در این صورت داده‌های خصوصی و حفاظت‌شده یک کلاس می‌توانند از سوی این تابع مورد دسترسی قرار گیرند. کامپایلر از روی کلیدواژه friend می‌فهمد که تابع مفروض یک تابع دوست است. برای دسترسی به داده‌ها، اعلان یک تابع دوست باید درون بدنه کلاس (هر جایی در کلاس از جمله درون بخش خصوصی یا عمومی می‌تواند باشد) و با کلیدواژه friend صورت بگیرد.

اعلان تابع دوست در ++C

class class_name
{
    ... .. ...
    friend return_type function_name(argument/s);
    ... .. ...
}

اکنون می‌توانید تابع دوست را به صورت یک تابع نرمال برای دسترسی به داده‌های یک کلاس تعریف کنید. هیچ کلیدواژه friend در این تعریف استفاده نشده است.

class className
{
    ... .. ...
    friend return_type functionName(argument/s);
    ... .. ...
}

return_type functionName(argument/s)
{
    ... .. ...
    // Private and protected data of className can be accessed from
    // this function because it is a friend function of className.
    ... .. ...
}

مثال 1: کار با تابع دوست

/* C++ program to demonstrate the working of friend function.*/
#include <iostream>
using namespace std;
class Distance
{
    private:
        int meter;
    public:
        Distance(): meter(0) { }
        //friend function
        friend int addFive(Distance);
};
// friend function definition
int addFive(Distance d)
{
    //accessing private data from non-member function
    d.meter += 5;
    return d.meter;
}
int main()
{
    Distance D;
    cout<<"Distance: "<< addFive(D);
    return 0;
}

خروجی

Distance: 5

در اینجا تابع دوست ()addFive درون کلاس Distance اعلان شده است. از این رو داده‌های خصوصی meter می‌توانند از این تابع مورد دسترسی قرار گیرند. با این که مثال فوق ایده‌ای در مورد مفهم یک تابع دوست در اختیار ما قرار می‌دهد، اما این کاربرد معنی‌داری محسوب نمی‌شود. کاربرد معنی‌دارتر تابع دوست در زمانی است که بخواهید روی اشیایی از دو کلاس متفاوت عمل کنید. در اینجا تابع دوست می‌تواند کاملاً مفید واقع شود. البته بدیهی است که می‌توانید روی دو شیء با کلاس‌های مختلف بدون استفاده از تابع دوست نیز عملیاتی اجرا کنید، اما در این صورت برنامه طولانی و پیچیده می‌شود و درک آن دشوار خواهد بود.

مثال 2: افزودن اعضا به 2 کلاس متفاوت با تابع دوست

#include <iostream>
using namespace std;
// forward declaration
class B;
class A {
    private:
      int numA;
    public:
      A(): numA(12) { }
      // friend function declaration
      friend int add(A, B);
};
class B {
    private:
       int numB;
    public:
       B(): numB(1) { }
       // friend function declaration
       friend int add(A , B);
};
// Function add() is the friend function of classes A and B
// that accesses the member variables numA and numB
int add(A objectA, B objectB)
{
   return (objectA.numA + objectB.numB);
}
int main()
{
    A objectA;
    B objectB;
    cout<<"Sum: "<< add(objectA, objectB);
    return 0;
}

خروجی

Sum: 13

در این برنامه کلاس‌های A و B اقدام به اعلام ()add به عنوان یک تابع دوست کرده‌اند. از این رو این تابع می‌تواند به داده‌های خصوصی هر دو کلاس دسترسی داشته باشد. در اینجا تابع ()add داده‌های خصوصی numA و numb از دو شیء objectA و objectB را جمع می‌کند و نتیجه را به تابع اصلی بازمی‌گرداند. برای این که برنامه به درستی کار کند، یک اعلان رو به جلو از کلاس class B باید مطابق مثال فوق انجام یابد. دلیل این امر آن است که class B درون class A با استفاده از کد زیر ارجاع یافته است:

friend int add(A, B);

کلاس دوست در برنامه‌نویسی ++C

به صورتی مشابه تابع دوست، یک کلاس نیز می‌تواند با استفاده از کلیدواژه friend به صورت دوست یک کلاس دیگر تعریف شود. به مثال زیر توجه کنید:

... .. ...
class B;
class A
{
   // class B is a friend class of class A
   friend class B;
   ... .. ...
}

class B
{
   ... .. ...
}

زمانی که یک کلاس به صورت کلاس دوست درآید، همه تابع‌های عضو آن کلاس به صورت تابع دوست درمی‌آیند. در این برنامه همه تابع‌های عضو class B به صورت تابع‌های دوست class A خواهند بود. از این رو هر تابع عضو کلاس B می‌تواند به داده‌های خصوصی و حفاظت‌شده کلاس B دسترسی داشته باشد. اما تابع‌های عضو کلاس A نمی‌توانند به داده‌های کلاس B دسترسی داشته باشند. به خاطر داشته‌ باشید که رابطه دوستی در ++C رابطه‌ای یک‌طرفه است، یعنی تنها اعطا می‌شود و اخذ نمی‌شود. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.

یک نظر ثبت شده در “توابع دوست و کلاس های دوست در ++C — راهنمای جامع

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر