Programming? – Telegram
Programming?
11.9K subscribers
373 photos
645 videos
978 files
512 links
🏅Channel privileges

🎗Ninth year of operation
🎗Completely specialized members
🎗Transmitter in channel automation
🎗, ...

🎯 second channel Programming books 👇
@topbookit

🎯 third channel laptop👇
@sysline


👨🏻‍💻Admin channels : @coderme
Download Telegram
نکته ) دقت کنید که برای تعریف بدنه و عملکرد یک تابع دوست کلاس دیگر نیازی به استفاده از عملگر :: به همراه نام کلاس نمی باشد در صورتیکه قبلا توضیح داده شد برای تعریف تابع عضو کلاس در بیرون از آن کلاس باید نام کلاس بهمراه عملگر :: ذکر شود .
در زیر به برنامه ای برای بکارگیری تابع دوست کلاس در C++ می پردازیم :
#include <iostream.h>
#include <conio.h>

class base
{
int val1,val2;
public:
void get()
{
cout « "Enter two values:";
cin » val1 » val2;
}
friend float mean(base ob);
};

float mean(base ob)
{
return float(ob.val1+ob.val2)/2;
}

void main()
{
clrscr();
base obj;
obj.get();
cout « "\n Mean value is : " « mean(obj);
getch();
}
در برنامه C++ بالا کلاسی بنام base وجود دارد که دارای 2 متغیر عضو private از نوع int و تابعی بنام get که دارای پارامتر ورودی نیست و دسترسی public برایش تعریف شده و یک تابع دوست کلاس بنام mean که نوع دسترسی آن مهم نیست و نوع بازگشتی float را برمیگرداند و دارای یک پارامتر ورودی است که شیئی از همان کلاس base میباشد .
بدنه تابع دوست کلاس از سطر 16 تا 19 در خارج از کلاس تعریف شده و براحتی و با ساخت یک شی بنام ob به متغیرهای عضو private کلاس base دسترسی دارد که میانگین دو عدد ورودی را محاسبه می نماید. در سطر 18 ما از اصل تبدیل نوع (Type Casting) برای جلوگیری از بروز خطای محاسباتی در نتایج برنامه استفاده کردیم. در واقع ما با استفاده از اصل تبدیل نوع به کامپایلر اعلام می کنیم که هرچند متغیرهای اولیه از نوع int هستند اما حاصل نتیجه را به صورت float و بدون گرد کردن و با قسمت اعشارش می خواهیم .
در نهایت و در تابع اصلی برنامه نیز یک شی از کلاس را ساخته و از آن استفاده می کنیم. نکته ای که عزیزان باید توجه کنند تابع clrscr است که در فایل سرآیند conio.h تعریف شده و موجب می شود که محتویات صفحه نمایش یا همان خروجی را پاک نماید و حافظه خروجی برنامه را clear کند که اسن دستور را هم در سطر 23 از برنامه C++ بالا مشاهده می کنیم .
کلاس دوست کلاس در برنامه نویسی ++c :
Class Friend class :
همانطور که یک تابع می تواند دوست یک کلاس باشد، یک کلاس هم می تواند برای کلاس دیگر دوست باشد که در این صورت کلاس دوست، به تمامی اعضای کلاس دیگر اعم از خصوصی یا حفاظت شده دسترسی خواهد داشت .
در زیر به برنامه ای برای بکارگیری کلاس دوست کلاس در C++ می پردازیم :
// friend class
#include <iostream>
#include <conio.h>
using namespace std;

class CSquare;

class CRectangle
{
int width, height;
public:
int area (){return (width * height);}
void convert (CSquare a);
};

class CSquare
{
private:
int side;
public:
void set_side (int a){side=a;}
friend class CRectangle;
};

void CRectangle::convert (CSquare a)
{
width = a.side;
height = a.side;
}

int main ()
{
CSquare sqr;
CRectangle rect;
sqr.set_side(4);
rect.convert(sqr);
cout « rect.area();
getch();
return 0;
}
دوستان عزیز می خواهیم که کد بالا را بررسی یا Trace نماییم و کاملا مانند کامپایلر رفتار می کنیم، پس به مراحل این عمل دقت فرمایید که از کجا شروع، بررسی کرده و آنرا به پایان می رسانیم :
از تابع main شروع می کنیم پس وارد این تابع می شویم. در سطر 33 از برنامه می بینیم که شیئی بنام sqr از کلاسی بنام CSquare ایجاد شده است پس در مرحله بعدی به سراغ کلاس CSquare می رویم تا بررسی کنیم که چه اعضایی دارد و این اعضا چه کار یا کارهایی را انجام می دهند .

تعریف کلاس CSquare از سطر 16 شروع شده و تا سطر 23 ادامه میابد که دارای یک عضو خصوصی بنام side از نوع داده int و یک تابع عضو عمومی بنام set_side و کلاس دوست کلاس CRectangle است. تابع عضو set_side یک نوع داده ای int را بعنوان پارامتر ورودی دریافت می کند و مقدار آنرا در متغیر side قرار می دهد .
به ادامه بررسی یا trace برنامه از سطر 34 می پردازیم. در این سطر هم یک شی بنام rect از کلاس CRectangle ایجاد شده است، لذا به بررسی این کلاس در ادامه می پردازیم .
تعریف کلاس CRectangle از سطر 8 از برنامه شروع شده و تا سطر 14 ادامه میابد. این کلاس شامل دو متغیر عضو خصوصی بنامهای width و height از نوع داده ای int و دو تابع عضو عمومی بنامهای area و convert می باشد که وظیفه تابع اول حاصلضرب دو متغیر عضو خصوصی و وظیفه تابع دوم از سطر 25 تا 29 تعریف شده است که این تابع ورودی از نوع شی از کلاس CSquare را دارد .

در سطر 35 از برنامه با استفاده از شی ایجاد شده از کلاس CSquare به تابع عضو set_side با پارامتری با مقدار 4 دسترسی پیدا می کنیم لذا مقدار متغیر side به 4 تبدیل می شود .
در سطر 36 نیز با استفاده از شی ایجاد شده از کلاس CRectangle به تابع عضو convert با ورودی شی sqr دسترسی پیدا می کنیم. پس مقدار 4 در دو متغیر width و height قرار گرفته و در ادامه و در سطر 37 با دسترسی به تابع convert این دو مقدار در هم ضرب شده و حاصلضرب آن دو به عنوان خروجی بر میگردد و چاپ می شود که همان مقدار 16 است .

چون در سطر 22 از برنامه C++ بالا کلاس CSquare دوست کلاس CRectangle تعریف شده پس براحتی در سطرهای 27 و 28 به متغیرهای عضو خصوصی این کلاس دسترسی پیدا کرده و بر روی آنها کار می کند و در صورتیکه اگر دوست کلاس مورد نظر نبود این اجازه را نداشته و برنامه با خطایی روبرو میشد .
امیدوارم که مراحل بررسی یا trace یک برنامه را درک کرده و متوجه شده باشید که چگونه می شود ساختار هر برنامه ای را بادقت و بدرستی چک نمود که مهارت در این شیوه کمک شایانی به دید برنامه نویسی و نهایتا نوشتن یک برنامه صحیح در زبان برنامه نویسی C++ خواهد نمود .
کپسوله کردن encapsulation در ++c :
قرار دادن داده و توابعی که روی داده کار می کنند را در یک بسته کپسوله کردن می گویند. در برنامه نویسی رویه گرا معلوم نیست چه تابعی روی چه متغیری کار می کند. در برنامه های پیچیده تر این روابط تیره تر می شوند. در برنامه نویسی شیءگرائی داده و توابع مربوط به آن- که اغلب متد (method) ناميده می شوند در يک بسته به نام کلاس قرار می گیرند بنابراین کاملا مشخص است چه تابعی روی چه داده ای کار می کند.

کپسول کردن امکان پنهان کردن اطلاعات را نيز فراهم می کند. هر عضو کلاس را می توان به صورت عمومی، خصوصی یا محافظت شده مشخص کرد. شی ايجاد شده از کلاس به داده از طريق يک سری توابع عمومی دسترسی دارد و اجازه دسترسی مستقيم به اعضای خصوصی کلاس و خراب کردن آنها داده نمی شود. به اين صورت جزئيات پياده سازی هم مخفی می ماند و به طراح اجازه می دهد پياده سازی را اساسی بدون تغيير در واسطه ها عوض کند.
مثال زیر رو در نظر بگیرید
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
👌1