تفاوتهای تابع در C
و C++
به صورت جزئی ممکنه خیلی زیاد باشه اما به طور کلی تفاوت اصلی تابع در این دو زبان برنامهنویسی مربوط به شیگرایی C++
(object-oriented) و ساختیافتگی C
(structrual) هست. این تفاوت باعث به وجود اومدن تفاوتهای مهم زیر شده:
حوزه تعریف تابع
تابع در C
میتونه در یک تابع تعریف دیگه باشه. یعنی دامنهی تعریف و استفادهش داخل بلاک یک تابه دیگه باشه. از این توابع به عنوان توابع تودرتو یا آشیانهای یاد میشه اما در C++
دامنهی تعریف توابع مربوط به اشیا هست و امکان تعریف تابع در تابع دیگه وجود نداره.
برای مثال در C
کد زیر معتبر هست
void f()
{
void g(){
printf("in g\n");
}
printf("in f\n");
g();
}
void main()
{
f();
}
تابع g
در f
که حوزهی تعریفش هست قابل استفاده هست اما در بیرون f
نمیتونه فراخوانی بشه.
این کد در C++
نمیتونه اجرا بشه. اما در C++
میشه حوزهی یک تابع رو به یک شی محدود کرد. کد زیر و ببینید:
#include <iostream>
class C
{
public:
void f()
{
std::cout<<"in f";
}
};
int main()
{
C obj;
obj.f();
return 0;
}
سربارگذاری تابع
در زبان C
وقتی بخوایم برای یک منظور از یک تابع استفاده کنیم نوع دادهی اون تابع باید مشخص باشه. مثلاً فرض کنیم میخوایم یک آرایه رو مرتب کنیم. باید مشخص کنیم که انواع داده چی هستن. مثلاً به صورت زیر
void isort(int arr[], unsigned int size)
{
...
}
اما حالا فرض کنید بخوایم همین تابع رو برای آرایهای از اعداد اعشاری بنویسیم. در صورتی که نخوایم از تبدیل صریح استفاده بشه باید یک تابع دیگه بنویسیم
void fsort(float arr[], unsigned int size)
{
...
}
و این اتفاق برای همهی انواع دادهای که بخوایم این تابع روی آرایهای از اونها عمل کنه، باید تکرار بشه و در هر حالت اسم تابع منحصر به فرد باشه. در صورتی که در C++
توابع میتونن همنام باشن و انواع دادهی ورودی اونها تغییر کنه. مثال بالا در C++
به شکل زیر قابل پیادهسازی هست
void sort(int arr[], unsigned int size)
{
}
void sort(float arr[], unsigned int size)
{
}
...
و در همهی حالتها از یه اسم برای این تابع استفاده میشه.
قالبها
برای مشکلی که در قسمت قبل ذکر شد یه راه بهتر هم در C++
وجود داره به نام قالب که به صورت زیر میشه یه تابع رو برای انواع دادهی مختلف تعریف کرد
template <class T>
function sort(T arr[], unsigned int size)
{
...
}
که این قابلیت در C
موجود نیست.
بیشتر تفاوتهای دیگه هم از همین تفاوت اصلی شیگرایی و ساختیافته بودن نشات میگیره که مهمترین اونها دو تفاوت بالاست.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)