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++ می پردازیم :
// 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
در قطعه کد بالا یک کلاس تعریف کرده ایم و تحت دسترسی public متدی را تعریف کرده ایم که نوع های داده ای که در پایین متد با حق دسترسی private تعریف شده است را کپسوله کرده است
چون داده هایی که با حق دسترسی private داخل یک کلاس تعریف می کنیم فقط داخل همان کلاس در دسترس هستن می توانیم این نوع داده ها رو داخل توابع دیگر که در داخل همان کلاس تعریف شده اند فرا بخونیم و کپسوله کنیم
ارث بری در کلاس ها (inheritance) در ++c :
👍1
یکی ديگر از جنبه های مفید برنامه نویسی شیءگرائی قابلیت استفاده مجدد از کد است. یک کلاس می تواند اعضای عمومی را از کلاس دیگر را به ارث ببرد. توارث اجازه می دهد کلاس جديدی شامل کليه داده ها و توابع کلاس (های) پياده سازی شود. کلاس موجود را کلاس پايه (base) و کلاس جديد که اعضای کلاس پايه را به ارث می گيرد را کلاس مشتق شده (derived) می نامند.
مثال. فرض کنيد يک کلاس پايه به نام Vehicle برای وسايل نقليه داريم. وسيله نقليه می تواند ماشين، تراکتور، قايق و هواپيما را شامل شود که ممکن است هر يک از آنها احتياج به اطلاعات يا توابع اضافی داشته باشند. بنابراين می توان برای هر کدام کلاس های فرعی را تعريف کرد که خواص کلاس Vehicle را به ارث می برند علاوه براين که دارای فيلدهای جديد ديگری هم هستند.
اگر کلاس ويژگی های تنها يک کلاس را به ارث ببرد وارثت منفرد(single inheritance) و اگر از چند کلاس به ارث گرفته شود وارثت چندگانه (multiple inheritance) ناميده می شود.

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