الدوال (Functions) في C++

الدوال في C++ ليست مجرد ميزة إضافية… هي جزء أساسي في هندسة البرامج. أي مشروع متوسط أو كبير—بدون دوال—رح يتحول لفوضى، كود مكرّر، وصعوبة في التطوير. لذلك، فهم الدوال هو خطوة انتقالية مهمة بين “مستوى المبتدئ” و “مستوى المبرمج الحقيقي”.

في هذا الدرس، رح نتعمق في:

✅ معنى الدوال ولماذا نحتاجها
✅ الدوال التي لا تُرجع قيمة (void)
✅ الدوال التي تُرجع قيمة (return)
✅ آلية عمل Stack Memory أثناء استدعاء الدوال
✅ تمرير القيم: بالقيمة (By Value) والمرجع (By Reference)
✅ تمرير المؤشرات للدوال (Pointers to Functions)
✅ الدوال الزائدة (Function Overloading)
✅ المتغيرات المحلية والعالمية (Scope)
✅ دوال مع معاملات افتراضية (Default Parameters)
✅ الدوال الداخلية Inline Functions
✅ روابط خارجية موثوقة للتعمق أكثر

هيا نبدأ…


1. ما هي الدوال؟ وليش نستخدمها أصلًا؟

الدالة Function = قطعة كود لها مهمة محددة.

ليش نكتب دوال بدل ما نكتب البرنامج كله في main()؟

✅ 1. التنظيم

بدل ما يكون عندك كود طوله 2000 سطر، بتقسمه لدوال كل وحدة مسؤولة عن شيء.

✅ 2. إعادة الاستخدام (Reuse)

دالة وحدة تجمع رقمين؟
ممتاز… استخدمها 100 مرة بدون كتابة الكود من جديد.

✅ 3. تصحيح أسهل (Debugging)

لو في مشكلة، بتعرف وين تدور بالضبط.

✅ 4. قابلية التطوير Scalability

أي تطوير مستقبلي رح يكون سهل إذا برنامجك مكوّن من وحدات مستقلة.


2. شكل الدالة في C++ (Structure of a Function)

شكل الدالة العام في C++:

نوع_الارجاع ReturnType اسم_الدالة FunctionName(المعاملات Parameters) {
    // جسم الدالة – التعليمات
}

مثال بسيط:

int sum(int a, int b) {
    return a + b;
}

3. أنواع الدوال: void والدوال التي تُرجع قيمة

3.1 الدوال من النوع void

هذه الدوال لا تُرجع أي قيمة.

void welcome() {
    cout << "أهلاً بك في كود التطور!" << endl;
}

تُستدعى هكذا:

welcome();

3.2 الدوال التي ترجع قيمة (return)

عندما نريد دالة تحسب قيمة وتُرجعها.

int multiply(int x, int y) {
    return x * y;
}

استخدامها:

int result = multiply(4, 5);

لاحظ:
بعد تنفيذ return تتوقف الدالة مباشرة.

لا يمكن كتابة أي تعليمات بعد return.


4. أين تذهب القيم عندما تستدعي الدالة؟ (Stack Memory)

فهم الـ Call Stack مهم جدًا.

✅ كل دالة تستدعيها → يتم إنشاء مساحة جديدة لها داخل Stack
✅ هذه المساحة تحتوي على المعاملات والمتغيرات الداخلية
✅ عندما تنتهي الدالة → يتم حذف هذه المساحة

مثال:

int sum(int a, int b) {   // a و b في الستاك
    int c = a + b;        // c في الستاك
    return c;
}
// بعد انتهاء الدالة يتم حذف a,b,c من الذاكرة.

5. تمرير القيم إلى الدوال

لدينا ثلاث طرق رئيسية:

5.1 التمرير بالقيمة (Pass By Value)

❗ يتم تمرير نسخة من المتغير.

لو عدّلت داخل الدالة → المتغير الأصلي برّا ما بتغير.

مثال:

void change(int x) {
    x = 100;
}

int main() {
    int a = 10;
    change(a);
    cout << a; // 10
}

5.2 التمرير بالمرجع (Pass By Reference)

❗ يتم تمرير نفس المتغير الحقيقي باستخدام &.

أي تعديل داخل الدالة يغيّر قيمة المتغير الأصلي.

void change(int &x) {
    x = 100;
}

int main() {
    int a = 10;
    change(a);
    cout << a; // 100 ✅
}

5.3 التمرير بالمؤشر (Pass By Pointer)

أقوى وأعمق مستوى من التمرير.

void change(int *ptr) {
    *ptr = 50;
}

int main() {
    int a = 10;
    change(&a);
    cout << a;  // 50 ✅
}

6. تحميل الدوال (Function Overloading)

تقدر تعمل عدة دوال بنفس الاسم…
لكن بشرط تختلف في:

✅ عدد المعاملات
✅ أو نوع المعاملات

مثال:

int sum(int a, int b) {
    return a + b;
}

double sum(double a, double b) {
    return a + b;
}

int sum(int a, int b, int c) {
    return a + b + c;
}

استدعاء:

sum(2,3);        // يستخدم دالة int
sum(2.5,3.3);    // يستخدم دالة double
sum(1,2,3);      // دالة ثلاثة معاملات

7. المتغيرات المحلية والعالمية (Scope)

7.1 المتغيرات المحلية Local

تُعرف داخل الدالة — تُستخدم داخلها فقط.

void test() {
    int x = 10; // محلي
}

7.2 المتغيرات العالمية Global

تُعرف خارج كل الدوال ويمكن استخدامها في كل البرنامج.

int count = 0;  // عالمي

void inc() {
    count++;
}

❗ المتغيرات العالمية يجب استخدامها بحذر لأنها قد تسبب فوضى إذا لم تُدار جيدًا.


8. المعاملات الافتراضية (Default Parameters)

تقدر تعطي قيم افتراضية للمعاملات.

void print(string text = "Hello") {
    cout << text << endl;
}

int main() {
    print();          // Hello
    print("مرحبا");   // مرحبا
}

9. الدوال الداخلية (Inline Functions)

تستخدم لتحسين الأداء عند وجود دوال صغيرة جدًا تُستدعى كثيرًا.

inline int square(int x) {
    return x * x;
}

عند الترجمة، يتم استبدال استدعاء الدالة مباشرة بالكود.

❗ استخدمها بحذر لأن الإفراط فيها يسبب زيادة حجم الكود (Code Bloat).


10. دوال تُعيد أكثر من قيمة (باستخدام المراجع)

void getStats(int a, int b, int &sum, int &diff) {
    sum = a + b;
    diff = a - b;
}

11. دوال تستقبل Arrays أو Strings

تمرير المصفوفات يتم دائمًا بالمرجع لأن اسم المصفوفة يشير إلى أول عنصر:

void printArray(int arr[], int size) {
    for(int i=0;i<size;i++) cout << arr[i] << " ";
}

12. روابط خارجية موثوقة للتوسع أكثر

📘 cppreference – أهم مصدر رسمي للمطورين:
https://en.cppreference.com/w/cpp/language/function

📘 GeeksForGeeks – شرح كامل للدوال:
https://www.geeksforgeeks.org/functions-in-cpp/

📘 W3Schools C++ Functions:
https://www.w3schools.com/cpp/cpp_functions.asp


الخلاصة النهائية

هذا الدرس خلاصة خبرة حقيقية… فهمك للدوال بالشكل العميق هو بوابتك لبناء برامج كبيرة، نظيفة، منظمة، وقابلة للتوسّع.

الدوال = العمود الفقري للبرمجة.
ومتى أتقنت:

✅ أنواع الدوال
✅ return و void
✅ التمرير بالقيمة والمرجع
✅ المؤشرات
✅ التحميل Overloading
✅ الـ Scope
✅ المعاملات الافتراضية

وقتها بتكون قطعت خطوة قوية جدًا باتجاه الاحتراف.


اكتشاف المزيد من كود التطور

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك رد

Scroll to Top