احتمالاً با تعریف متغیر ثابت از انواع پایه مثل int آشنا باشید. نکتهی زیاد خاصی ندارد. فقط باید بدانید که تنها جایی که کامپایلر به شما اجازهی مقداردهی آن را میدهد، هنگام تعریفش است.
const float PI = 3.14F; PI += 1.0F; /*Compile Error*/ PI = 2.0F; /*Compile Error*/
حالا میخواهیم بپردازیم به const object. در اینجا هم وقتی شی را به صورت const تعریف میکنیم، اجازه نداریم که data memberها را در جایی به جز هنگام تعریف تغییر دهیم. فرق هم نمیکند که این data member به صورت public تعریف شده و شما قصد تغییر مستقیم آن را دارید. یا اینکه به صورت private است و از طریق فراخوانی یکی از توابع کلاس میخواهید آن را تغییر دهید.
حالا بریم سراغ یک مثال. پیشنهاد میکنم کد زیر را ابتدا در یک کامپایلر وارد کنید و خطوط کامنت شدهی برنامه را یکی یکی تست کنید.
#include <iostream>
using namespace std;
class date
{
private:
int special_day;
int special_month;
public:
int year {};
int month {};
int day {};
date(int y, int m, int d) : year(y), month(m), day(d)
{
special_month = 1;
special_day = 11;
}
void increment_day()
{
special_day++;
}
void print_special_day() const
{
std::cout << special_day << endl;
}
void print_special_month()
{
std::cout << special_month << endl;
}
};
int main()
{
const date today { 2020, 10, 14 };
//today.day += 1;
//today.increment_day();
//today.print_special_day();
//today.print_special_month();
return 0;
}
طبق چیزی که جلوتر گفتم دو خط 45 و 46 باید برایتان مشخص باشد. اما 47 و 48 کمی داستانشان فرق میکند. ما در اینجا متغیری را تغییر ندادیم، اما باز میبینیم هنگام فراخوانی تابع print_special_month کامپایلر به ما خطا میدهد. نکتهی قضیه در این است که حتا اگر تابع فراخوانی شده از const object قرار نباشد مقدار dataها را تغییر دهد، در صورتی که بعد از تعریف آرگومانهای تابع کلمهی const را قرار ندهیم، کامپایلر به ما خطا میدهد. به همین دلیل هست که در فراخوانی تابع print_special_day به مشکلی برنمیخوریم و عدد 11 چاپ میشود.
توجه داشته باشید گذاشتن const هم در declaration تابع لازم هست و هم در definition آن.
حالا میتوانید تستهای دیگری هم با کد بالا انجام دهید. مثلا برای تابع increment_day هم const قرار دهید و ببینید آیا میتوان آن را فراخوانی کرد.
یا اینکه اگر یک شی غیر const از این کلاس تعریف کنیم، فراخوانی توابع const امکان پذیر است؟
برای سوال اول اگر امتحان کنید، نباید تغییری در عدم اجازهی کامپایلر در فراخوانی increment_day ببینید. چراکه هنوز در بدنه تابع داریم متغیری از کلاس را تغییر میدهیم.
در خصوص سوال دوم هم باید بگم که در یک شی غیر const هیچ تفاوتی بین تابع const و غیر const وجود ندارد. به همین دلیل هم توصیه میشود که اگر تابعی از کلاس شما مقادیر دادههای کلاس را تغییر نمیدهد آن را const تعریف کنید تا در آینده اگر شی const از این کلاس ساختیم، بتوانیم این نوع توابع را فراخوانی کنیم.
دیجیلاگیست محلی برای کسانی که به دنیای دیجیتال و آنالوگ علاقه دارند