سلام!

این جلسه به مبحثی می پردازیم که فقط مربوط به class نیست و ابعاد وسیع تری را در بر دارد.

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

int pi = acos(-1);

مشکل این کار این است که این مقدار در طول برنامه قابل تغییر است اما شما به چنین تغییری نیاز ندارید. بنابراین می توانید بنویسید:

const int pi = acos(-1);

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

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main(){
    const double pi = acos(-1);
    int radius;
    cin >> radius;
    printf("Masahat: %f\nMohit: %f\n", pi * pow(radius, 2), pi * 2 * radius);
    return 0;
}

حال می خواهیم object های ثابت را تعریف کنیم. object های ثابت object هایی هستند که تنها می توانند از توابع ثابت، تابع سازنده، تابع مخرب و چند نوع تابع دیگر استفاده کنند. توابع ثابت توابعی هستند که قابلیت تغییر عضوهای یک class را ندارند. چگونگی تعریف توابع ثابت را توضیح می دهم. فعلا به مثال زیر دقت کنید.

#include <iostream>

using namespace std;

class A{
    private:
        int _num; //vojoode _ ghabl az esm baraye in ast ke badan betavanim be jaye tarife functione getNum() functioni be name num() tarif konim
    public:
        A(int num = 0) : _num(num) {}
        int num();
        void setNum(int);
};

int A::num(){
    return this->_num;
}

void A::setNum(int num){
    this->_num = num;
}

int main(){
    A a;
    cout << a.num() << endl;
    a.setNum(10);
    cout << a.num() << endl;
    return 0;
}

حالا به مثال زیر دقت کنید. می بینید که استفاده از تابع های معمولی در یک object ثابت ممنوع است.

#include <iostream>

using namespace std;

class A{
    private:
        int _num; //vojoode _ ghabl az esm baraye in ast ke badan betavanim be jaye tarife functione getNum() functioni be name num() tarif konim
    public:
        A(int num = 0) : _num(num) {}
        int num();
        void setNum(int);
};

int A::num(){
    return this->_num;
}

void A::setNum(int num){
    this->_num = num;
}

int main(){
    const A a;
    cout << a.num() << endl;
    a.setNum(10);
    cout << a.num() << endl;
    return 0;
}

شکل درست این برنامه به صورت زیر است.

#include <iostream>

using namespace std;

class A{
    private:
        int _num; //vojoode _ ghabl az esm baraye in ast ke badan betavanim be jaye tarife functione getNum() functioni be name num() tarif konim
    public:
        A(int num = 0) : _num(num) {}
        int num() const;
        void setNum(int);
};

int A::num() const{
    return this->_num;
}

void A::setNum(int num){
    this->_num = num;
}

int main(){
    const A a;
    cout << a.num() << endl;
//    a.setNum(10); object const ast baraye hamin nemitavan meghdar ozvhaye on ra avaz kard magar ba constructor
    cout << a.num() << endl;
    return 0;
}

نکته: بهتر است که توابع getter را به صورت ثابت تعریف کنید که بعدا بتوان از class هم به صورت ثابت استفاده کرد و هم به صورت معمولی.

مباحث این جلسه تمام شدند. برای تمرین برنامه هایی که قبلا نوشته اید را طوری تغییر دهید که بتوان از class مورد نظر یک object ثابت هم ساخت.

موفق باشید!