توابع دوست و کلاس های دوست در ++C – راهنمای جامع


در این مقاله با شیوه ایجاد توابع دوست و کلاسهای دوست در ++C آشنا میشویم و از آنها به طرز مؤثری در برنامههای خود استفاده میکنیم. یکی از مهمترین مفاهیم برنامهنویسی شیءگرا بحث پنهانسازی دادهها است. بدین ترتیب تابعهای غیر عضو نمیتوانند به دادههای خصوصی یا حفاظتشده شیء دسترسی پیدا کنند. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی روی لینک زیر کلیک کنید:
اما گاهی اوقات این محدودیت برنامهنویس را مجبور میکند تا کدهای طولانی و پیچیدهای بنویسد. بنابراین یک مکانیسم داخلی در برنامهنویسی ++C تعبیه شده است تا بتوان از تابعهای غیر عضو نیز به دادههای خصوصی و حفاظتشده دسترسی یافت. این کار با استفاده از «تابع دوست» یا «کلاس دوست» انجام میپذیرد.
تابع دوست در ++C
اگر تابعی به صورت تابع دوست تعریف شده باشد، در این صورت دادههای خصوصی و حفاظتشده یک کلاس میتوانند از سوی این تابع مورد دسترسی قرار گیرند. کامپایلر از روی کلیدواژه friend میفهمد که تابع مفروض یک تابع دوست است. برای دسترسی به دادهها، اعلان یک تابع دوست باید درون بدنه کلاس (هر جایی در کلاس از جمله درون بخش خصوصی یا عمومی میتواند باشد) و با کلیدواژه friend صورت بگیرد.
اعلان تابع دوست در ++C
اکنون میتوانید تابع دوست را به صورت یک تابع نرمال برای دسترسی به دادههای یک کلاس تعریف کنید. هیچ کلیدواژه friend در این تعریف استفاده نشده است.
مثال 1: کار با تابع دوست
خروجی
Distance: 5
در اینجا تابع دوست ()addFive درون کلاس Distance اعلان شده است. از این رو دادههای خصوصی meter میتوانند از این تابع مورد دسترسی قرار گیرند. با این که مثال فوق ایدهای در مورد مفهم یک تابع دوست در اختیار ما قرار میدهد، اما این کاربرد معنیداری محسوب نمیشود. کاربرد معنیدارتر تابع دوست در زمانی است که بخواهید روی اشیایی از دو کلاس متفاوت عمل کنید. در اینجا تابع دوست میتواند کاملاً مفید واقع شود. البته بدیهی است که میتوانید روی دو شیء با کلاسهای مختلف بدون استفاده از تابع دوست نیز عملیاتی اجرا کنید، اما در این صورت برنامه طولانی و پیچیده میشود و درک آن دشوار خواهد بود.
مثال 2: افزودن اعضا به 2 کلاس متفاوت با تابع دوست
خروجی
Sum: 13
در این برنامه کلاسهای A و B اقدام به اعلام ()add به عنوان یک تابع دوست کردهاند. از این رو این تابع میتواند به دادههای خصوصی هر دو کلاس دسترسی داشته باشد. در اینجا تابع ()add دادههای خصوصی numA و numb از دو شیء objectA و objectB را جمع میکند و نتیجه را به تابع اصلی بازمیگرداند. برای این که برنامه به درستی کار کند، یک اعلان رو به جلو از کلاس class B باید مطابق مثال فوق انجام یابد. دلیل این امر آن است که class B درون class A با استفاده از کد زیر ارجاع یافته است:
کلاس دوست در برنامهنویسی ++C
به صورتی مشابه تابع دوست، یک کلاس نیز میتواند با استفاده از کلیدواژه friend به صورت دوست یک کلاس دیگر تعریف شود. به مثال زیر توجه کنید:
زمانی که یک کلاس به صورت کلاس دوست درآید، همه تابعهای عضو آن کلاس به صورت تابع دوست درمیآیند. در این برنامه همه تابعهای عضو class B به صورت تابعهای دوست class A خواهند بود. از این رو هر تابع عضو کلاس B میتواند به دادههای خصوصی و حفاظتشده کلاس B دسترسی داشته باشد. اما تابعهای عضو کلاس A نمیتوانند به دادههای کلاس B دسترسی داشته باشند. به خاطر داشته باشید که رابطه دوستی در ++C رابطهای یکطرفه است، یعنی تنها اعطا میشود و اخذ نمیشود. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C++
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- ارسال آرایه به یک تابع در ++C — راهنمای جامع
- تابع های ++C — به زبان ساده
==
خیلی ممنون به کارم اومد