تابع دوست (Friend Function)

یک تابع دوست تابعی است که از اعضای یک کلاس نیست ولی می‌تواند به اعضای یک کلاس که دارای سطح دسترسی private و protected هستند دسترسی داشته باشد. برای اینکه یک تابع خارجی را به عنوان دوست یک کلاس تعریف کنیم از کلمه کلیدی friend استفاده می‌کنیم. ساختار کلی تعریف یک تابع دوست به صورت زیر می‌باشد:

class ClassName
{
    friend return-type function-name(params-list);
};

همانطور که مشاهده می‌کنید ما فقط prototype تابع را داخل کلاس تعریف کردیم و پیاده سازی آن را در خارج از کلاس انجام می‌دهیم. منظور از prototype این است که فقط تابع را اعلان کنیم یعنی نام تابع، نوع برگشتی و پارامترهای آن را مشخص کنیم و پیاده سازی آن را در جای دیگری انجام دهیم. ویژگی‌های یک تابع دوست عبارتند از:

  • تابع دوست یک تابع عادی است که در خارج از یک کلاس تعریف می‌کنیم فقط با این تفاوت که می‌توانیم به اعضای یک کلاس که دارای سطح دسترسی private و protected هستند دسترسی داشته باشیم.
  • نمی‌توانیم به توابع دوست با استفاده از عملگر dot (.) یا <- دسترسی داشته باشیم.
  • یک تابع دوست نمی‌تواند به عنوان عضو یک کلاس در نظر گرفته شود
  • یک تابع می‌تواند در هر تعداد کلاسی که می‌خواهد به عنوان دوست تعریف شود
  • از آنجایی که یک تابع دوست یک تابع عضو محسوب نمی‌شود، بنابراین ما نمی‌توانیم با استفاده از اشاره گر this به آن‌ها اشاره کنیم.
  • کلمه کلیدی friend فقط برای اعلان تابع مورد استفاده قرار می‌گیرد و در زمان تعریف تابع از آن استفاده نمی‌کنیم.
  • یک تابع دوست می‌تواند به اعضای یک کلاس با استفاده از یک شی از آن کلاس دسترسی داشته باشد.

برنامه زیر نحوه استفاده از یک تابع دوست را نشان می‌دهد:

#include <iostream>
#include <string>
using namespace std;

class Student
{
  private:
    string Name;
    
  public:
    void setName(string);
    friend void ShowDetails(Student);
};

void Student::setName(string name)
{
  Name = name;
}

void ShowDetails(Student s)
{
  cout << "Name of the student is: " << s.Name << endl;
}

int main()
{
  Student student1;
  student1.setName("Jack");
  ShowDetails(student1);
}
Jack

در برنامه بالا تابع ShowDetails می‌تواند به متغیر name که یک متغیر private در کلاس Student است دسترسی داشته باشد.