فصل ۵: توابع (Functions) در C++
🎯 هدف یادگیری
در این فصل یاد میگیرید:
- تابع چیست و چرا لازم داریم.
- ساختار و نحوه تعریف توابع در C++.
- نحوه ارسال پارامترها و دریافت مقادیر بازگشتی.
- انواع تابع (بدون مقدار بازگشتی، با مقدار بازگشتی، بدون پارامتر، با پارامتر).
- مفهوم توابع بازگشتی (Recursion).
- قواعد نامگذاری و محدوده متغیرها در توابع.
- Overloading توابع.
- نکات و اشتباهات رایج در استفاده از توابع.
۱. تابع چیست؟
تابع یک بخش مستقل از کد است که یک کار خاص را انجام میدهد و میتواند چند بار در برنامه فراخوانی شود.
هدف:
- جلوگیری از تکرار کد
- بهبود خوانایی
- استفاده مجدد
- تقسیم پروژه به قطعات کوچکتر
مثال ساده بدون تابع:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, Ali!" << endl;
cout << "Hello, Sara!" << endl;
cout << "Hello, Reza!" << endl;
}
اگر بخوایم این کار رو با تابع انجام بدیم:
نسخه با تابع:
#include <iostream>
using namespace std;
void sayHello(string name) {
cout << "Hello, " << name << "!" << endl;
}
int main() {
sayHello("Ali");
sayHello("Sara");
sayHello("Reza");
}
📌 مزیت → کوتاهتر، قابل تغییر و بدون تکرار.
۲. ساختار تعریف تابع
یک تابع در C++ به صورت کلی:
نوع_برگشتی نام_تابع(لیست_پارامترها) {
// بدنه تابع
return مقدار; // فقط اگر نوع تابع void نیست
}
مثال:
int sum(int a, int b) {
return a + b;
}
۳. قسمتهای یک تابع
- نوع بازگشتی (Return type): نوع دادهای که تابع برمیگرداند (
int
,double
,string
,void
و غیره). - نام تابع: باید معنادار و طبق قوانین نامگذاری متغیرها باشد.
- پارامترها: متغیرهایی که به تابع ارسال میکنیم.
- بدنه تابع: دستورات اجرایی تابع.
- return: مقدار خروجی تابع (اگر نوع تابع void نباشد).
۴. انواع تابع
۴.۱ بدون مقدار بازگشتی (void
)
void greet() {
cout << "Hello!" << endl;
}
۴.۲ با مقدار بازگشتی
double square(double x) {
return x * x;
}
۴.۳ با پارامتر، بدون پارامتر
- بدون پارامتر:
void info() {
cout << "C++ course" << endl;
}
- با پارامتر:
int sum(int a, int b) {
return a + b;
}
۵. فراخوانی تابع (Function Call)
وقتی تابع تعریف شد، برای اجرای آن باید فراخوانی کنیم:
int result = sum(4, 5);
cout << result;
۶. ترتیب تعریف یا Prototype
در C++ میتوانیم:
- تابع را قبل از
main()
تعریف کنیم. - یا اول اعلان (Prototype) کنیم، بعد از
main()
بدنه را بنویسیم.
مثال:
int sum(int, int); // اعلان (prototype)
int main() {
cout << sum(2, 3);
}
int sum(int a, int b) { // تعریف
return a + b;
}
۷. ارسال پارامترها (Pass by Value)
پیشفرض: کپی مقدار پارامتر به تابع ارسال میشود و تغییرات روی نسخه اصلی در بیرون اثر ندارد.
void changeValue(int x) {
x = 10;
}
int main() {
int a = 5;
changeValue(a);
cout << a; // همچنان 5
}
📌 در آینده (فصل اشارهگرها) Pass by Reference رو یاد میگیریم.
۸. توابع بازگشتی (Recursion)
تابعی که خودش را فراخوانی میکند.
مثال: محاسبه فاکتوریل
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
⚠ دقت کنید که باید شرط پایان داشته باشید، وگرنه حلقه بیپایان میشود.
۹. متغیرهای محلی و سراسری در توابع
- متغیرهای تعریفشده داخل تابع محلی هستند.
- متغیرهای سراسری خارج از تمامی توابع تعریف میشوند.
۱۰. Overloading توابع
تعریف چند تابع با یک نام اما پارامترهای متفاوت:
int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }
۱۱. نکات و هشدارها
⚠ همیشه نوع بازگشتی را مشخص کنید، حتی اگر void باشد.
⚠ مراقب Recursion بدون شرط پایان باشید.
⚠ پارامتر اضافی باعث خطای کامپایل میشود مگر Overload تعریف کرده باشید.
۱۲. اشتباهات رایج
❌ تعریف تابع بعد از main
بدون prototype.
❌ فراموش کردن return
در توابع غیر void.
❌ اشتباه نوع پارامتر باعث ناسازگاری در فراخوانی.
۱۳. تمرینها
تمرین ۱
تابعی بنویسید که دو عدد را گرفته و حاصل ضرب آنها را برگرداند.
تمرین ۲
تابعی بنویسید که شعاع دایره را گرفته و محیط و مساحت را چاپ کند.
تمرین ۳
تابع بازگشتی برای جمع اعداد از ۱ تا n بنویسید.
تمرین ۴ (چالش)
Overload تابع برای محاسبه توان عدد (power
) بنویسید، یک نسخه برای int و یک نسخه برای double.
۱۴. جمعبندی
- تابع یک بلوک کد مستقل است که میتوان آن را بارها اجرا کرد.
- انواع توابع: با مقدار بازگشتی، بدون مقدار بازگشتی، بازگشتی.
- پارامترها بهصورت کپی (Pass by value) ارسال میشوند مگر روش دیگری تعیین شود.
- Overloading یکی از قابلیتهای مهم C++ است.