الثوابت (Constants)

أحيانًا نحتاج إلى قيمة لا تتغيّر أثناء تشغيل البرنامج، وهذا بالضبط هو دور الثوابت (constants).

تساعد الثوابت في منع الأخطاء (مثل تغيير رقمٍ بالخطأ) وتجعل الكود أسهل في الفهم.

مثال: متغيّر عادي مقابل ثابت

#include <iostream>
using namespace std;

int main() {
    int age = 15;
    age = 16; // we can change it

    const double PI = 3.14159;
    // PI = 3.14;  Error! cannot change a constant

    cout << "PI is " << PI << endl;
    return 0;
}

المخرجات:

PI is 3.14159

لماذا نستخدم الثوابت؟

  • لحماية القيم المهمة من التغيير غير المقصود.
  • لجعل الكود أوضح وأسهل قراءة — المتغيّر PI أكثر وضوحًا من الرقم 3.14159.
  • لتسهيل التحديث — إذا تغيّرت قيمة PI (وإن كان ذلك غير محتمل)، يمكن تعديلها في مكانٍ واحد فقط.

تعريف الثوابت

يتم إنشاء ثابت في C++ بإضافة الكلمة المفتاحية const قبل نوع البيانات:

const int DAYS_IN_WEEK = 7;
const double GRAVITY = 9.81;
const char GRADE = 'A';

يجب أن تُعطى الثوابت قيمة لحظة تعريفها ولا يمكن تركها دون تهيئة.

الثوابت الحرفية (Literal Constants)

الثوابت الحرفية هي القيم التي تظهر مباشرةً في الكود، مثل:

int x = 5;         // 5 is an integer literal
double pi = 3.14;  // 3.14 is a double literal
char letter = 'A'; // 'A' is a character literal
string word = "Hi"; // "Hi" is a string literal

هذه مجرّد قيم خام (raw values) تُكتب مباشرةً داخل الكود.

اللواحق الحرفية الشائعة (Common Literal Suffixes)

يمكنك أن تخبر C++ بنوع القيمة العددية باستخدام اللواحق (suffixes) التالية:

القيمة الحرفية النوع المعنى
5 int عدد صحيح افتراضي
5U unsigned int عدد صحيح غير سالب
5L long عدد صحيح طويل
5LL long long عدد صحيح كبير جدًا
3.14f float عدد عشري بدقة مفردة
3.14 double النوع الافتراضي للأعداد العشرية
3.14L long double عدد عشري بدقة عالية

مثال:

float a = 3.14f;
long long b = 10000000000LL;
long double c = 3.1415926535L;

إذا لم تُضِف لاحقة، فإن C++ تفترض النوع int للأعداد الصحيحة وdouble للأعداد العشرية.

الثوابت باستخدام #define (الطريقة القديمة)

قبل ظهور الكلمة المفتاحية const، كان المبرمجون يستخدمون #define لتعريف الثوابت:

#define PI 3.14159
#define GREETING "Hello"

ما زالت هذه الطريقة تعمل، ولكن const تُعَدّ أكثر أمانًا ومُفضّلة في C++ الحديثة.

جدول المراجعة

الطريقة المثال هل يمكن التغيير؟ متى تُستخدم
const const int x = 5; لا دائمًا مع القيم الثابتة
#define #define Z 15 لا أسلوب قديم، يُفضّل تجنّبه في C++ الحديثة

خلاصة سريعة

  • استخدم const مع القيم التي لا يجب أن تتغيّر.
  • استخدم اللواحق مثل LL أو f لاختيار النوع العددي المناسب.
  • تجنّب #define للثوابت إلا عند قراءة كودٍ قديم.

باستخدام الثوابت، يصبح الكود أكثر أمانًا، وأوضح، وأسهل في الصيانة.