التحميل الزائد (Overloading)
عدّة دوال بنفس الاسم لكن بمعاملات مختلفة — C++ يختار المناسبة حسب الوسائط:
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
string add(string a, string b) {
return a + b;
}
int main() {
cout << add(3, 4); // 7 (نسخة int)
cout << add(2.5, 1.5); // 4.0 (نسخة double)
cout << add("أ", "ب"); // أب (نسخة string)
}
الوسائط الافتراضية
قيمة تُستخدم إن لم يمرّر المستدعي الوسيط:
int power(int base, int exp = 2) {
int result = 1;
for (int i = 0; i < exp; i++) result *= base;
return result;
}
cout << power(5); // 25 (exp = 2 افتراضيًّا)
cout << power(5, 3); // 125
الاستدعاء الذاتي (Recursion)
دالة تستدعي نفسها — مع شرط توقّف:
int factorial(int n) {
if (n <= 1) return 1; // شرط التوقّف
return n * factorial(n - 1); // الاستدعاء الذاتي
}
cout << factorial(5); // 120
⚠️ كل دالة تكرارية يجب أن تملك حالة أساسية (شرط توقّف)، وإلا حدث تكرار لا نهائي وانهيار المكدّس (Stack Overflow).
مثال: متتالية فيبوناتشي
int fib(int n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
cout << fib(7); // 13
تمرير بالمرجع لتجنّب النسخ
void printName(const string& name) { // بلا نسخ، وللقراءة فقط
cout << name;
}
استخدام const& يتجنّب نسخ القيم الكبيرة مع منع تعديلها.
أخطاء شائعة
- نسيان حالة التوقّف في الدوال التكرارية (Stack Overflow).
- تعريف وسائط افتراضية في المنتصف — يجب أن تكون في النهاية فقط.
🎯 التالي: الأصناف والبواني بالتفصيل.