خوراک پی سی کدنویس

ورود کاربران

آمار سایت

اعضا : 551
محتوا : 76
پیوندها : 6
بازدیدهای محتوا : 334830

حاضرین در سایت

 40 مهمان حاضر

برای نمایش بهتر سایت، از مرورگر استاندارد فایرفاکس استفاده کنید! مرورگر اینترنت اکسپلورر متعلق به دهه گذشته است!

firefox icon

Valid XHTML 1.0 Transitional Valid CSS!

کلاسها در ++C: بخش دوم نحوه تعریف کلاس

18 امتیاز

نحوهی تعریف کلاس

برای تعریف یک کلاس، از کلمهی کلیدی class استفاده میکنیم به صورت زیر:
 
class CRect{
public:
   CRect()//default constructor
   {
      top = left = right = bottom = 0;
   };
   CRect(int t, int l, int r, int b) //A better constructor
   {
      top = t;
      left = l;
      right = r;
      bottom = b;
   };  
 
   ~CRect(){};//default destructor
 
   void ShowCoord()//A member function
   {
      std::cout << "(top, left): (" << top << "," << left << ")\n";
      std::cout << "(bottom, right): (" << bottom << "," << right << ")\n";
   }
 
   int top, left, right, bottom; //Member variables
};
 

پس از کلمه کلیدی class، نام کلاس می‌آید که در مثال فوق، اسم CRect را انتخاب کردهایم. گذاشتن حرف C سنتی است که در visual c++ مرسوم است و برای انواع دادهای کلاس استفاده میشود؛ البته اختیاری است.
کلمهی کلیدی public سطح دسترسی را تعیین میکند و به معنی بیشترین سطح دسترسی به متغیرها و توابع کلاس است. بعدا در این مورد بیشتر صحبت خواهیم کرد. پس از این کلمه کلیدی، به ترتیب دو تابع سازنده ، یک تابع مخرب ، یک تابع عضو برای نمایش مختصات مستطیل و چهار متغیر برای نگهداری مختصات معرفی شدهاند. در ادامه به تعریف آنها میپردازیم.

توابع سازنده و مخرب

هر کلاس میتواند تعدادی تابع سازنده و یک تابع مخرب داشته باشد. تابع سازنده، مسئول مقداردهی متغیرهای عضو کلاس برای اشیاء جدید است. از سوی دیگر تابع مخرب، مسئول تخریب شیء ایجاد شده است. معمولا مهمترین کار تابع مخرب، آزادسازی حافظههایی است که احتمالا به شیء تخصیص پیدا کرده است. لذا اگر متغیری که حافظه مصرف کند نداشته باشیم، غالبا نیازی به پیاده سازی تابع مخرب نداریم. تابع سازنده باید همنام اسم کلاس باشد، در مثال فوق دو تابع سازنده تعریف کردهایم که یکی هیچ پارامتری نمیگیرد و دیگری مختصات چهارگانه را از کاربر میگیرد. همچنین یک تابع مخرب تعریف کردهایم که هیچ کاری انجام نمیدهد. تابع مخرب نیز همنام کلاس است با این تفاوت که یک علامت ~ قبل از آن قرار دارد.

سوالی که احتمالا برایتان پیش آمده، این است که چرا یک کلاس میتواند چندین تابع سازنده داشته باشد لیکن فقط یک تابع مخرب باید داشته باشد؟ برای روشن شدن موضوع بهتر است مثالی از دنیای واقعی بزنیم: یک لیوان شیشهای به طرق و اشکال مختلف قابل ساخت است، لیکن برای از بین بردن هر لیوانی تنها کافیست آن را به یک کودک بسپاریم! کلکش ساخته است و نیازی به مخرب دیگری نیtwست. البته خود شما هم میتوانید آن را به گوشهای پرت کنید و صدای خرد شدن آن را گوش کنید. باز هم لیوان تخریب خواهد شد. راه سوم هم این است که آن را ذوب و یا حتی تبخیر کنید (اگر مسافران فضایی باشید!). پس راههای بسیار زیادی برای تخریب وجود دارد که هر کدام از آنها به تنهایی کفایت کرده و عمر شیء مذکور را به پایان میرساند. بنابراین هیچ نیازی به داشتن چندین مخرب نداریم.

متغیرهای عضو

هر کلاس تعدادی متغیر دارد که ویژگیها و خواص آن کلاس را بیان میکنند. در مثال فوق، کلاس CRect چهار متغیر عضو دارد که بیانگر مختصات بالا، چپ، پایین و راست مستطیل هستند. در مقالات گذشته دیدیم که متغیرهای معمولی را میتوانیم در زمان تعریف مقدار دهی اولیه کنیم، لیکن متغیرهای عضو کلاس را نمی-توانیم در زمان تعریف مقداردهی اولیه کنیم؛ لذا تعریف زیر اشتباه است:
 
class CRect{
public:
   //...
   //Initialization is not possible 
   int top = 0, left = 0, right = 0, bottom = 0;//ERROR
};
 

خوب پس چاره چیست؟ بهترین راه برای مقداردهی اولیه متغیرهای عضو کلاس، استفاده از تابع سازنده است که اصولا به همین منظور به وجود آمده است. دقت کنید که اگر یکی از متغیرهای عضو کلاس، یک اشارهگر است که در تابع سازنده یا تابع دیگری از کلاس، با استفاده از عملگر new حافظهای را گرفته است، حتما باید با استفاده از عملگر delete، در تابع مخرب آزاد شود.

توابع عضو

توابعی که در کلاس تعریف میکنیم، قابلیتهای آن کلاس هستند. در مثال سادهای که مطرح کردهایم، تنها یک تابع عضو داریم که مشخصات مستطیل را چاپ میکند.

در مقالات بعدی، نحوه تولید اشیاء و استفاده از توابع و متغیرهای عضو کلاس را بیان خواهیم کرد.

  • farhad  - Help!
    avatar
    با سلام
    من خواهشی از شما داشتم این بود که درباره توابع سازنده ومخرب اگه ممکن هست چند مثال با توضیحات ذکر کنید ممنون می شم با تشکر از زحمات شما
  • مدیر سایت
    avatar
    توابع سازنده و مخرب چیز خاصی ندارد. سازنده تابعی همنام کلاس است که غالبا مقداردهی اولیه متغیرهای کلاس را انجام می دهد مثلا در همین مثالی که در بالا ذکر شده دو تابع سازنده دیده می شود که هر کدام به شکلی متغیرهای کلاس را مقدار اولیه می دهد، یکی از کاربر می گیرد و دیگری همه متغیرها را با صفر پر می کند.
    تابع مخرب هم تنها یکی است که باز هم همنام کلاس است و فقط یک ~ اولش دارد. غالبا آزادسازی حافظه در آن صورت می گیرد. اگر حافظه ای به متغیرهای کلاس تخصیص نداده اید، می توانید اصلا مخرب ننویسید.
  • roksan
    avatar
    kasah ye chanta mesale bishtar mizadin ke kameltar beshe va qabele fahm tar beshe. :0 :( :(
  • miti
    avatar
    این مثال بالایی فقط کلاس را تعریف می کنه یا کار دیگه ای هم انجام می ده؟ :?: :?:
  • مدیر سایت
    avatar
    فقط کلاس را تعریف می کند!
  • miti
    avatar
    می شه مثالی بزنید که علاوه بر تعریف کلاس عملی را هم انجام بده؟
  • miti
    avatar
    اگه ممکنه نحوه ی استفاده ی کلاسها را هم توضیح بدید.(توضیح متنی)
  • miti  - کتابخانه
    avatar
    کتبخانه های اصلی مورد نیاز برای رسم اشکال گرافیکی در C++ را همراه با مهمترین توابع آن توضیح بدید.
  • ناشناس
    avatar
    اگه میشه لطفا set و get رو هم بگید.برای متغیر های public
  • محمد
    avatar
    چجوری میشه به آرایه دو بعدی با تابع سازنده مقدار دهی کرد اونم با مقادیر دلخواه نه مقدار ثابت .

    لطفا مثالی بذارید
    ممنون :evil:
  • ناشناس  - c++ گیلاوا
    avatar
    آیا ارسال شی به یک تابع آیا تابع سازنده 2بار فراخوانی میشود؟ :?:
  • مدیر سایت
    avatar
    خیر
    تا جایی که می دانم یکبار فراخوانی می شود. لیکن دقت کنید که اگر شیء را به صورت اشاره گر یا با ارجاع نفرستید، در واقع کپی شیء به تابع ارسال شده و سازنده کپی آن فراخوانی خواهد شد.
    مثال ارسال از طریق ارجاع:
    void function(ANewType& object); // object passed by reference
  • hamed  - سوال
    avatar
    آيا ميشه ادرس توابع سازنده و مخرب را فهميد؟

    لطفا هرچه زودتر خبرم كنيد
  • afshin  - انواع کلاس ها در ز#
    avatar
    سلام. خسته نباشید.ممکنه ازتون خواهش کنم انواع کلاس ها در c# رو به من بگید؟ متشکرم
  • ehsan  - سازنده ها در C++
    avatar
    سلام می خواستم در مورد انواع مقدار دهی سازنده ها بپرسم؟
اظهار نظر
مشخصات شما:
گراواتار enabled
نظر:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):s:!::?::idea::arrow:
امنیت
کد آنتی اسپم نمایش داده شده در عکس را وارد کنید.