حال که با مفهوم ساختار آشنا شده اید در این قسمت وارد مبحث کلاس می شویم. کلاس ها ارکان برنامه نویسی شی گرا را تشکیل می دهند .تعریف کلاس در حقیقت تعریف یک نوع داده جدید توسط برنامه نویس است. کلاس در مقایسه با ساختار دارای قدرت و انعطاف پذیری بیشتری می باشد. در تعریف کلاس می توان علاوه بر فیلد، متد هایی را برای پردازش فیلدها تعریف کرد. در یک کلاس برای هر فیلد یا متد می توان یک مشخصه دستیابی تعریف نمود. اگر شما فیلد یا متدی را به صورت عمومی (public) تعریف نمایید در هر جایی از برنامه می توانید به آن دسترسی داشته باشید ولی اگر از مشخصه دستیابی خصوصی (private) برای آن استفاده نمایید ان گاه اجازه ندارید در خارج از محدوده کلاس از آن استفاده نمایید. در حقیقت شما باید تمامی فیلدها را به صورت خصوصی فقط برای همان کلاس تعریف نمایید و اجازه دسترسی به فیلدها را در خارج از بلاک کلاس به کاربران ندهید. این مسئله به موضوع مهمی به نام اصل پنهان سازی داده اشاره میکند. برای خواندن و تنظیم فیلدهای خصوصی دو متد به نام های get و set به صورت زیر تعریف نمایید. حال کلاس Date را تعریف می کنیم. 


class Date {
    private:    
       int year;
       int month;
       int day;
    public:    
       void init(int y, int m, int d) {
           year = y;
           month = m;
           day = d;
       }
       int getYear() {
           return year;
       }
       int getMonth() {
           return month;
       }
       int getDay() {
           return day;
       }
       void setYear(int y) {
           year = y;
       }
       void setMonth(int m) {
           month = m;
       }
       void setDay(int d) {
           day = d;
       }
       void print() {
           cout << year << "/" << month << "/" << day;
       }
};

در تعریف کلاس Date فیلدها به صورت خصوصی تعریف شده اند ولی تمامی متدها عمومی هستند. اگر متغیری به نام field در کلاس تعریف شده باشد متدهای خواندن و نوشن آن را به صورت زیر تعریف می کنیم. 


type getField() {
     return field;
}
void setField(type value) {
     field = value;
}

به جای type باید نوع فیلد field را قرار دهید. حرف اول نام فیلد از حروف بزرگ انتخاب شده است. البته می توانید از فرمت های دیگری مثل get_field وset_field استفاده نمایید. متد init صرفا برای مقداردهی اولیه فیلدهای شی تعریف شده است. بعد از تعریف یک شی از کلاس بلافاصله باید این متد را فراخوانی نمایید تا مقادیر فیلدها را تنظیم نمایید. استفاده از نام init دلیل خاصی ندارد شما می توانید از هر نام بامعنایی استفاده نمایید. یادمان باشد که نام متد باید بیانگر کار ان متد باشد! البته می توانید به جای فراخوانی متد init متدهای set را فراخوانی نمایید. هدف از تعریف متد init را در ادامه در خواهید یافت. به عنوان تمرین برنامه را بدون فراخوانی متد init اجرا نمایید تا نتیجه را مشاهد کنید! 

شکل کلی تعریف کلاس به صورت زیر است. 


class className
{
     private:

       //private functions and variables

     public:

       //public functions and variables
}

ناگفته نماند که مشخصه دستیابی سومی هم به نام protected وجود دارد که در مبحث وراثت از آن استفاده می شود. فعلا ترجیح می دهم که به ان نپردازم. 
حال که در ابتدای راه هستید سعی کنید که تمامی فیلدها را به صورت خصوصی، و تمامی توابع را به صورت عمومی تعریف نمایید. در ادامه این آموزش قطعا فیلدهایی به صورت عمومی و حتی استاتیک تعریف خواهیم کرد. همچنین متدهایی را به صورت خصوصی تعریف کرده تا فقط در داخل خود کلاس قابل استفاده باشند. خواهید دید که درک این مطلب بسیار آسان است.! 
در تعریف کلاس می توانید ابتدا توابع و به دنبال آن متغیرها را تعریف کنید. جزییات زیادی راجب تعریف کلاس وجود دارد که من فعلا از گفتن انها صرف نظر میکنم و سعی خواهم کرد در لابلای این آموزش کم و بیش به انها اشاره نمایم. از متد init برای مقدار دهی اولیه متغیرها استفاده کرده بودیم. در واقع شما با تعریف سازنده (constructor) در یک کلاس می توانید این کار را انجام دهید. سازنده برای مقداردهی اولیه متغیرها در کلاس تعریف می شود. زمانی که یک شی را ایجاد می نمایید سازنده منتاظر با ان شی به صورت خودکار فراخوانی می شود و نیازی به فراخوانی سازنده نیست! از قطعه کد زیر برای تعریف شی استفاده نمایید. 


Date d(1363, 4, 20);

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


Date(int y, int m, int d) {
    year  = y;
    month = m;
    day   = d;
}

بهتر است سازنده را در ابتدا بعد از مشخصه public تعریف نمایید بعد از ان توابع خواندن و نوشتن و در ادامه سایر توابع! می توانید سازنده را هم به صورت کوتاه زیر تعریف نمایید. 


Date(int y, int m, int d) : year(y), month(m), day(d) {}

در این صورت می توانید دستوراتی را در بدنه سازنده قرار دهید. در این روش مقادیر y، m و d به ترتیب در متغیر های year، month و day قرا خواهند گرفت. این بستگی به شما دارد که از کدام روش استفاده نمایید. همچنین می توان بیش از یک سازنده برای کلاس تعریف نماییم. 


Date() {
    year = month = day = 0;
}
Date(int y) {
    year = y;
    month = day = 0;
}
Date(int y, int m) {
    year = y;
    month = m;
    day = 0;
}
Date(int y, int m, int d) {
    year  = y;
    month = m;
    day   = d;
}

برای مثال دستورات زیر را در نظر بگیرید. 


Date d0;
Date d1(1363);
Date d2(1363, 4);
Date d3(1363, 4, 20);

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


#include <iostream>
using namespace std;

class Date{

    private:
       int year;
       int month;
       int day;

    public:
       Date(int y=0, int m=0, int d=0) {
           year = y;
           month = m;
           day = d;
           validate();
       }
       int getYear() {
           return year;
       }
       int getMonth() {
           return month;
       }
       int getDay() {
           return day;
       }
       void setYear(int y) {
           year = y;
       }
       void setMonth(int m) {
           month = m;
       }
       void setDay(int d) {
           day = d;
       }
       void print() {
           cout << year << "/" << month << "/" << day;
       }
    private:     
       void validate() {
           if (year < 1300 || year > 1400)
               year = 1300;
           if (month < 1 || month > 11)
               month = 1;
           if (day < 1 || day > 31)
               day = 1;
       }
};

int main() {
    Date d0;
    Date d1(1363);
    Date d2(1363, 4);
    Date d3(1363, 14, 720);

    d0.print();
    d1.print();
    d2.print();
    d3.print();

    return 0;
}

به عنوان تمرین کلاس Student را تعریف نمایید. سعی کنید از توابع خصوصی هم استفاده نمایید. 
امیدوارم این آموزش به درک بهتر شما کمک کرده باشد. 
:)

آیا این پاسخ به شما کمک کرد؟ 217 کاربر این را مفید یافتند (217 نظرات)