تکین وب | آموزش برنامه نویسی
تکین وب | آموزش برنامه نویسی

مفهوم شیء گرایی و کلاس

۲۳ شهریور ۱۳۹۴

همه ی برنامه هایی که قرار است بنویسیم ، به سادگی برنامه هایی که تاکنون نوشته ایم ، نیستند . شاید بخواهیم به طراحی و پیاده سازی یک برنامه ی پیجیده  مثلا طراحی یک بازی بپردازیم . بازی ای که مطمئنا اجزای زیادی دارد و طبق خواسته ی برنامه نویس عمل خواهد کرد . فرض کنیم می خواهیم یک پیست اتومبیل رانی را طراحی کنیم . این پیست دارای تعداد زیادی اتومبیل  می باشد که همه ی آن ها ویژگی هایی مانند رنگ بدنه ی اتومبیل ، میزان سوخت مصرفی ، مدل ، یک نام منحصر به فرد ، شماره پلاک و ….. هستند . بنابراین طبق آنچه تا کنون درمورد متغیرها می دانیم ، باید هر یک از این ویژگی ها در یک متغیر ذخیره شود . مثلا رنگ بدنه ی اتومبیل در آرایه ای از کارکترها ، شماره پلاک اتومبیل در long int و …. باید ذخیره شوند . اما نکته ای که وجود دارد این است که ما میخواهیم همه ی این ویژگی ها باهم به کار برده شوند . به همین منظور از ساختار class استفاده می کنیم :

speed-dreams-20-car-ls1

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

برای طراحی یک کلاس از دستور زیر استفاده می کنیم :

نام دلخواه  class

}

 : private

….

 : public

….

 : protected

….

;{

در این دستور ، برای معرفی یک کلاس باید بعد از نوشتن کلمه ی class ، یک نام دلخواه در نظر بگیریم . مثلا کلاس car_racing ، که این نام طبق آنچه درمورد نامگذاری متغیرها گفته شد ، انجام می شود :

class car_racing
{
....
};

بدنه ی یک کلاس در یک بلاک نوشته می شود . بعد از بلاک باید ازعلامت سمیکالن ( ; ) استفاده کرد .

در هر کلاس سه نوع دسترسی وجود دارد :

  1. private
  2. public
  3. protected

کمترین سطح دسترسی مربوط به private  می باشد . (در بخش های بعدی به مفهوم این جمله خواهید رسید ) . توابع و متغیرهایی که در این قسمت تعریف می شوند فقط داخل کلاس و توابع آن قابل دسترسی هستند و بیرون از کلاس (مثلا در main) نمی توان از آن ها استفاده نمود. نکته ای که باید بدانید این است که نمی توان این متغیرها را در این قسمت مقداردهی اولیه کرد :

class car_racing
{
private :
long int car_number ;
char car_name[20] ;
char color[20] ;
float Fuel ;
};

تا اینجا کلاسی به نام  car_racing که دارای اعضای خصوصی( private ) می باشد را تعریف کردیم . اما نوع دوم دسترسی که public یا عمومی نام دارد ، دارای توابع و اعضایی است که در همه جا بنابر شرایطی می توان به آ نها دسترسی داشت . این قسمت علاوه بر دو تابع مهم به نام constructor(سازنده) و destructor( مخرب) از توابع و متغیرهایی تشکیل شده است . نوع سوم یا protected (به معنای محافظت شده )هم دسترسی ای بین private و public دارد .( با protected در بخش ارث بری بیشتر آشنا خواهید شد )

constructor تابعی است که وظیفه ی ساختن اشیایی که می خواهیم داشته باشیم را بر عهده دارد .(ساختن به این معنا که به متغیرهایی که در کلاس تعریف شده اند حافظه ای را اختصاص می دهد) . این تابع هیچ مقدار خروجی ای ندارد و بنابر خواسته ی برنامه نویس ، هم می تواند پارامتر ورودی داشته باشد و هم می تواند نداشته باشد. توجه کنید که constructor هم نام کلاس می باشد .

destructor هم تابعی هم نام کلاس است که وظیفه ی تخریب کردن اشیاء ساخته شده را برعهده دارد . برای معرفی مخرب از علامت تیلدا (~) در ابتدای این تابع استفاده می کنیم . این تابع هیچ پارامتر ورودی و خروجی ای ندارد :

class car_racing
{ 
private :
long int car_number ;
char car_name[20] ;
char color[20];
float Fuel ;
public :
car_racing();
~car_racing();
void input();
};

مثلا در تکه کد بالا در قسمت public ، همانطور که گفته شد ، سازنده هم نام کلاس و بدون هیچ پارامتر ورودی و مخرب که با علامت ~  در ابتدای آن مشخص شده است ، تعریف شده اند . اما نکته ای که وجود دارد این است که سازنده چگونه به ساختن شیء می پردازد یا اصلا بدنه  توابع سازنده و مخرب چگونه تعریف می شوند ؟

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

برای اینکه بتوان این ویژگی ها (رنگ و نام و….) را مشخص کرد، معمولا از توابعی در قسمت public استفاده می شود . الگوی این توابع مانند آنچه در قسمت آشنایی با توابع بیان شد ، می باشند . بدنه ی این توابع هم بنابر کاری که  برنامه نویس می خواهد انجام دهد ، پیاده سازی خواهند شد . مثلا در تکه کد بالا تابع ()input برای گرفتن ویژگی های هر اتومبیل استفاده می شود .

باید بدانید اگر به طور صریح از کلمه ی public استفاده نکنید ، کامپایلر آن را private درنظر می گیرد . بنابراین اگر برای تعریف توابع و متغیرهای private از کلمه ی private استفاده نکردید ، کامپایلر به طور پیش فرض آنها را private در نظر خواهد گرفت .

حال به بررسی پیاده سازی توابع می پردازیم :

می توان توابع را در بدنه ی کلاس تعریف کرد . اما بهتر است آن ها را بیرون از بلاک کلاس تعریف نمود . برای تعریف توابع از علامت :: (scope)  ، استفاده می شود . مثلا در تکه کد زیر به پیاده سازی تابع ()input  می پردازیم :

void car_racing::input()
{
cout<<"Enter the NUMBER , NAME , COLOR and FUEL of your car"<<endl;
cin>>car_number>>car_name>>color>>Fuel;
}

برای تعریف یک تابع عضو کلاس در ابتدا باید خروجی تابع قید شود . سپس نام کلاس و بعد از آن از علامت اسکوپ و نام تابع و ورودی آن نوشته می شود .  همانطور که ملاحظه می کنید در بدنه ی تابع از دستور cout  و cin استفاده شده است . اما توجه کنید که چون داده های private فقط در توابع عضو کلاس قابل دسترسی اند ، می توان از آنها استفاده نمود .

بدنه ی توابع constructor و destructor می توانند بدون هیچ دستوری پیاده سازی شوند و خالی بمانند . در این صورت کامپایلر فقط  وظیفه ی ساخت و تخریب اشیاء را به وسیله ی این توابع خواهد داشت (در برنامه هایی که در قسمت های بعدی ارائه می شود ، خواهید دید که در constructor ، متغیرهای بخش private مقدار دهی اولیه خواهند شد . )

car_racing::car_racing()
}
{
/*****/
car_racing::~car_racing()
}
{

تکه کد بالا نحوه ی پیاده سازی constructor و destructor را در بیرون از بلاک کلاس نشان می دهد .

اما سوالی که ممکن است پیش بیاید این است که چگونه می توان از این کلاس در main استفاده کرد . باید بگوییم بعد از پیاده سازی کلاس و توابع عضو آن ابتدا باید در بدنه ی main تعداد شیء هایی که می خواهیم بسازیم را مشخص کنیم . مثلا برنامه نویس می خواهد در پیستی که طراحی می کند ، تعداد ۱۰ اتومبیل که هر کدام ویژگی های منحصر به فرد شامل رنگ و نام و…. متفاوت هستند ، ایجاد کند . برای تعریف یک شی یا اشیاء باید از دستور زیر استفاده نمایید :

    ; نام شیء   نام کلاس

car_racing car1;

بنابر تکه کد بالا ما یک اتومبیل خواهیم داشت که می توانیم با تابع عضو ()input ویژگی های دلخواهی را برای آن در نظر بگیریم . همینطور برای ساخت تعداد بیشتری از اشیاء می توانیم آرایه ای از اشیاء را داشته باشیم :

car_racing car[10];

با این دستور به تعداد ۱۰ عدد اتومبیل خواهیم داشت .

علاوه بر این روش ، روش دیگری برای ساخت یک شی وجود دارد و آن به صورت زیر بعد از تعریف کلاس می باشد :

class car_racing
{ 
private :
long int car_number ;
char car_name ;
char color;
float Fuel ;
public :
car_racing();
~car_racing();
void input();
}car1;

همانطور که ملاحظه می کنید شیء car1 بعد از تعریف کلاس و قبل از علامت سمیکالن معرفی شده است .

حال می خواهیم به وسیله ی تابع عضو ()input به تخصیص ویژگی های دلخواه هر اتومبیل بپردازیم :

int main()
{
car_racing car1;
car1.input();
}

در تکه کد بالا بعد از تعریف شیء car1 تابع عضو ()input به وسیله ی علامت دات (.) صدا زده شده است .

تکه کد زیر هم آرایه ای از اتومبیل ها را ایجاد می کند و به وسیله ی تابع عضو ()inpute ویژگی های هر اتومبیل را از کاربر دریافت خواهد کرد :

int main()
{
car_racing car[10];
for(int i=0 ;i <10 ;i++)
car[i].input();
}

به کوتاه شدن main توجه کنید . به اینکه هیچ کس نمی تواند بفهمد که شما در تابع ()input از چه متغیرهایی استفاده کرده اید و یا اینکه آن را چگونه پیاده سازی کرده اید . این فقط بخش کمی از ویژگی های استفاده از کلاس ها می باشد . در آینده خواهید دید که می توان کاری کرد که همین تابع ()input هم مخفی بماند و main فقط یک جمله با عملکرد بالا باشد .

در این قسمت شما با مفهوم کلاس و شیء گرایی در ++C با تکه کدهایی که برای تعریف یک کلاس به کار برده می شوند ،  آشنا شدید .  در قسمت بعدی به نحوه ی پیاده سازی کامل یک کلاس در main و فایل های cpp. و h. در ویژوال استادیو خواهیم پرداخت .

در ضمن اگر اینستاگرامی هستید حتما @Takinweb را فالو کنید….

 

 

درباره ی عطیه رحمانی

دیدگاه ها

4 دیدگاه ارسال شده !

  1. محمد می‌گه:

    خیلی خوب بود
    اگر امکانش هست ازین آموزشهای پایه ای ( برای افراد مبتدی ) بیشتر بذارید.
    مثلا استفاده از struct ها توی کلاس نویسی خودم حسابی باهاش مشکل دارم.

    ممنون

    • عطیه رحمانی می‌گه:

      سلام . ممنون از نظرتون .
      حتما از این دست آموزشها هم قرار میدیم . فکر میکنم منظور شما چیزی شبیه به این مثال باشه :

      #include "iostream"
      #include<stdlib.h>
      using namespace std ;
      class Example
      {
      public :
      	struct ex
      	{
      		int num ;
      
      	}Object;
      	void print(int num){cout<<num<<" is in struct"<<endl ;}
      };
      int main()
      {
      	Example e ;
      	e.Object.num = 32 ;
      	e.print(e.Object.num);
      	system("pause");
      	return 0 ;
      }
      
      • محمد می‌گه:

        ممنون از پاسخگویی سریع
        دلیل استفاده نکردن از پرایوت موقع تعریف کلاس چیه ؟
        موقع نوشتن بدنه توابع بکار رفته توی کلاس در روش قبل به پرایوتها دسترسی داشتیم اما در این روش باید از object.num بجای چرایوت استفاده بشه. درسته ؟

        • عطیه رحمانی می‌گه:

          ما زمانی از private استفاده می کنیم ک نخوایم اونو توی main بکار ببریم و اصلا چیزی ک در حوزه ی private تعریف شده باشه اجازه ی دسترسی بهش به طور مستقیم در main وجود نداره مگر اینکه از یک getter یا setter استفاده کنید . درواقع ی جور پنهان سازی یا بهتره بگم کپسوله کردن اطلاعات .(یک نقطه ی اتصال بین Main و مقادیر private) من اینجا struct رو در حوزه ی public تعریف کردم تا بشه توی main به اطلاعاتش ب طور مستقیم دسترسی داشت . توی مثالهایی مثل کلاس date که در بخش های بعدی تعریف کردم ، بعضی مقادیر ب صورت private و بعضی مقادیر هم به صورت public تعریف شدند . دلیلش هم در همین بخش توضیح داده شده که هدف چیه ؟؟!
          درمورد سوالتونم باید بگم در این روش منظورتون تعریف struct در حوزه public هست؟ اگ منظورتون همینه ک دلیلشو گفتم . چون publicهست میشه توی main با شیءای ک ازش ساختیم دسترسی داشته باشیم .
          این فقط یک مثال بود . وگرنه شما می تونید از struct در حوزه ی private هم استفاده کنید . اما به این شکل نمی تونید ب طور مستقیم در main ب اون دسترسی داشته باشید

دیدگاه خود را به ما بگویید.

کلیه ی حقوق مادی و معنوی مطالب متعلق به سایت تکین وب می باشد و کپی برداری و بازنشر آن بدون ذکر منبع کاری غیر حرفه ای و غیر اخلاقی و قابل پیگرد قانونی خواهد بود.
کانال تلگرام تکین وب