سلام

در این جلسه به طور پایه ای به مبحث برنامه نویسی شی گرا یا object oriented programming می پردازیم.

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

راه دومی هم وجود دارد که بسیار ساده تر است. شما می توانید مفهومی به نام آدم درست کنید و در همان مفهوم توابع مربوط به آدم را نیز درست کنید. سپس برای ساخت یک آدم تنها بنویسید:

Adam a;

در واقع شما یک «شی» به نام آدم درست کرده اید. استفاده از این مفهوم را برنامه نویسی شی گرا می نامند.

استفاده از این روش هم به خوانایی کد کمک می کند، هم به مرتب سازی کد و هم به ساده سازی کد.

حال بیایید با طرز پیاده سازی یک شی آشنا شویم. منظور از شی، یک نمود از یک مفهوم است. مثلا اصغر یک شی است و نمود یک آدم است. به آدم یک class و به اصغر یک Object می گویند. در اینجا می خواهیم با طرز ساختن یک class آشنا شویم. این کار بسیار شبیه تعریف struct است:

class Adam{
};

در کلاس سه نوع «سطح دسترسی» داریم که عبارت اند از: public، private و protected. فعلا به protected نیازی نداریم.

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

اگر برای یک عضو از class سطح دسترسی به صورت private تعریف شود، استفاده از این عضو فقط برای عضوهای دیگر این class ممکن است. این سطح دسترسی برای جلوگیری از کاربر برای تغییر آزادانه ی متغیرها خوب است. مثلا شما یک متغیر به نام وزن دارید. اگر کاربر بتواند آزادانه این متغیر را تغییر بدهد، آن وقت امکان اشتباه زیاد می شود. ولی شما (به عنوان پیاده کننده ی class) می توانید یک تابع به نام setWeight بنویسید که یک عدد ورودی می گیرد و آن را در وزن می ریزد. حالا می توانید در این تابع کنترل های لازم را انجام دهید. مثلا اگر عدد وارد شده منفی بود، آن را در وزن نریز. در واقع در بیشتر اوقات باید برای متغیرهای درون class توابع getter و setter تعریف کنید.

برای آشنایی بیشتر با مفاهیم ارائه شده به مثال زیر توجّه کنید؛

class Adam{
    private:
        int weight, height, gender;
    public:
    
        void setWeight(int newWeight){
            weight = newWeight;
        }        
        
        void setHeight(int newHeight){
            height = newHeight;
        }
        
        void setGender(int newGender){
            gender = newGender;
        }
        
        int getWeight(){
            return weight;
        }
        
        int getHeight(){
            return height;
        }
        
        int getGender(){
            return gender;
        }
        
};

متغیرهای وزن، قد و جنسیت private هستند تا کاربر نتواند به آن ها دسترسی داشته باشد. در قسمت public تابع هایی تعریف کرده ایم که این متغیرها را تغییر می دهند یا مقدار آن ها را برمی گردانند.

نکته: برای این که متن بدنه ی class خواناتر شود، می توانید به صورت زیر برنامه اش را بنویسید.

#include <iostream>

using namespace std;

class Adam{
    private:
        int weight, height, gender;
    public:

        void setWeight(int);
        void setHeight(int);
        void setGender(int);
        
        int getWeight();
        int getHeight();
        int getGender();
};

void Adam::setWeight(int newWeight){
    weight = newWeight;
}

void Adam::setHeight(int newHeight){
    height = newHeight;
}

void Adam::setGender(int newGender){
    gender = newGender;
}

int Adam::getWeight(){
    return weight;
}

int Adam::getHeight(){
    return height;
}

int Adam::getGender(){
    return gender;
}

حالا می خواهیم از این class استفاده کنیم. برای این که با طرز استفاده از این class آشنا شوید، به مثال زیر دقت کنید؛

#include <iostream>

using namespace std;

class Adam{
    private:
        int weight, height, gender;
    public:
    
        void setWeight(int newWeight){
            weight = newWeight;
        }        
        
        void setHeight(int newHeight){
            height = newHeight;
        }
        
        void setGender(int newGender){
            gender = newGender;
        }
        
        int getWeight(){
            return weight;
        }
        
        int getHeight(){
            return height;
        }
        
        int getGender(){
            return gender;
        }
        
};

int main(){
    Adam adam;
    adam.setWeight(67);
    adam.setHeight(189);
    adam.setGender(0);
    cout << "Weight: " << adam.getWeight() << "\nHeight: " << adam.getHeight() << "\nGender: " << adam.getGender() << endl;
    return 0;
}

فعلا مبانی اصلا مبحث برنامه نویسی شی گرا تمام شد. برای این که بر مبانی مسلط شوید، می توانید از تمرین های زیر کمک بگیرید:

۱. یک class به نام آدم بنویسید. برای آن خصوصیاتی مثل قد، وزن، موقعیت (x) بنویسید. سپس برای آن یک تابع به نام walk تعریف کنید که یک متغیر ورودی بگیرد و x را به اندازه ی آن متغیر اضافه کند. برای تمامی متغیرها getter و setter تعریف کنید.

۲. یک class به نام ماشین بنویسید. برای آن خصوصیاتی مانند طول، عرض، حداکثر سرعت، حداکثر شتاب، سرعت کنونی و شتاب کنونی تعریف کنید. برای همه ی این خصوصیات getter و setter بنویسید. کنترل های لازم را هنگام مقداردهی سرعت و شتاب اعمال کنید (سرعت جدید و شتاب جدید بیشتر از حداکثر سرعت و حداکثر شتاب نباشند).

۳. یک class به نام ماشین حساب بنویسید. در آن دو عدد اعشاری و توابعی مثل میانگین، جمع، ضرب و تقسیم را تعریف کنید (برای تابع تقسیم از تقسیم عدد اول بر عدد دوم استفاده کنید).

۴. یک class به نام آرایه بنویسید. در آن یک آرایه ی ۲۰ تایی تعریف کنید. تابعی در آن تعریف کنید که ۲ عدد ورودی بگیرد: شماره ی خانه و مقدار. سپس مقدار را در خانه ی مورد نظر بریزد. سپس تابعی بنویسید که شماره ی خانه را بگیرد و مقدار آن را برگرداند. کنترل های لازم را انجام دهید (اگر شماره ی خانه از ۲۰ بیشتر بود -۱ برگردانید). یک تابع sort هم برای آن بنویسید. سپس در برنامه ی اصلی و با کمک همین توابع تمامی خانه ها را از کاربر بگیرید و آن را مرتب کنید. سپس آرایه ی جدید را چاپ کنید.

موفق باشید!