کلاس

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

class ClassName
{
    field1;
    field2;
    ...
    fieldN;

    method1;
    method2;
    ...
    methodN;  
};

این کلمه کلیدی را قبل از نامی که برای کلاسمان انتخاب می کنیم می نویسیم. در نامگذاری کلاسها هم از روش نامگذاری Pascal استفاده می کنیم. در بدنه کلاس فیلدها و متدهای آن قرار داده می شوند.بعد از آکولاد بسته هم علامت سمیکالن (;) قرار می گیرد. در زیر نحوه تعریف و استفاده از یک کلاس ساده به نام person نشان داده شده است :

   1: #include <iostream>
   2: #include <string>
   3: using namespace std;
   4: 
   5: class Person
   6: {
   7:     public: string name;
   8:      int age;
   9:      double height;
  10:     
  11:     public: void TellInformation()
  12:     {
  13:         cout << "Name: " << name << endl;
  14:         cout << "Age: " << age << " years old" << endl;
  15:         cout << "Height: " << height << "cm" << endl;
  16:     }
  17: };
  18: 
  19: int main()
  20: {
  21:     Person firstPerson;
  22:     Person secondPerson;
  23: 
  24:     firstPerson.name = "Jack";
  25:     firstPerson.age = 21;
  26:     firstPerson.height = 160;
  27:     firstPerson.TellInformation();
  28: 
  29:     cout << endl; //Separator
  30: 
  31:     secondPerson.name = "Mike";
  32:     secondPerson.age = 23;
  33:     secondPerson.height = 158;
  34:     secondPerson.TellInformation();
  35: }
Name: Jack
Age: 21 years old
Height: 160cm

Name: Mike
Age: 23 years old
Height: 158cm

برنامه بالا شامل دو کلاس Person و Program می باشد. می دانیم که کلاس Program شامل متد ()main است که برنامه برای اجرا به آن احتیاج دارد ولی اجازه دهید که بر روی کلاس Person تمرکز کنیم. در خطوط 17-5 کلاس Person تعریف شده است. در خط 5 یک نام به کلاس اختصاص داده ایم تا به وسیله آن قابل دسترسی باشد. در داخل بدنه کلاس فیلدهای آن تعریف شده اند (خطوط 9-7) و سطح دسترسی آنها را public قرار داده ایم تا در خارج از کلاس قابل دسترسی باشند. درباره سطوح دسترسی در یک درس جداگانه بحث خواهیم کرد. این سه فیلد تعریف شده خصوصیات واقعی یک فرد در دنیای واقعی را در خود ذخیره می کنند. یک فرد در دنیای واقعی دارای نام، سن، و قد می باشد. در خطوط 16-11 یک متد هم در داخل کلاس به نام ()TellInformation تعریف شده است که رفتار کلاسمان است و مثلا اگر از فرد سوالی بپرسیم در مورد خودش چیزهایی می گوید. در داخل متد کدهایی برای نشان دادن مقادیر موجود در فیلدها نوشته شده است. نکته ای درباره فیلدها وجود دارد و این است که چون فیلدها در داخل کلاس تعریف و به عنوان اعضای کلاس در نظر گرفته شده اند محدوده آنها یک کلاس است.

این بدین معناست که فیلدها فقط می توانند در داخل کلاس یعنی جایی که به آن تعلق دارند و یا به وسیله نمونه ایجاد شده از کلاس مورد استفاده قرار بگیرند. در داخل متد ()main و در خطوط 22-21 دو نمونه یا دو شی از کلاس Person ایجاد می کنیم. برای ایجاد یک نمونه از یک کلاس ابتدا نام کلاس و سپس نامی که برای شیء قرار است انتخاب کنیم و در نهایت علامت سمیکالن می گذاریم :

ClassName ObjectName ;

وقتی نمونه کلاس ایجاد شد، سازنده را صدا می زنیم. یک سازنده متد خاصی است که برای مقداردهی اولیه به فیلدهای یک شی به کار می رود. وقتی هیچ آرگومانی در داخل پرانتزها قرار ندهید ،کلاس یک سازنده پیشفرض بدون پارامتر را فراخوانی می کند. درباره سازنده ها در درس های آینده توضیح خواهیم داد. در خطوط 26-24 مقادیری به فیلدهای اولین شی ایجاد شده از کلاس Person (first Person) اختصاص داده شده است. برای دسترسی به فیلدها یا متدهای یک شی از علامت نقطه (دات) استفاده می شود. به عنوان مثال کد firstPerson.name نشان دهنده فیلد name از شی firstPerson می باشد. برای چاپ مقادیر فیلدها باید متد ()TellInformation شی firstPerson را فراخوانی می کنیم. در خطوط 33-31 نیز مقادیری به شی دومی که قبلا از کلاس ایجاد شده تخصیص می دهیم و سپس متد ()TellInformation را فراخوانی می کنیم. به این نکته توجه کنید که firstPerson و secondPerson نسخه های متفاوتی از هر فیلد دارند بنابراین تعیین یک نام برای secondPerson هیچ تاثیری بر نام firstPerson ندارد. در مورد اعضای کلاس در درسهای آینده توضیح خواهیم داد.