Learning ©➕➕
4.52K subscribers
81 photos
2 videos
38 files
182 links
ک
Download Telegram
#135
#function #توابع
✅ توابع inline در ++C ؟

تابع زیر رو در نظر بگیرین:

#include <iostream>
using namespace std;

void compute (int a,int b);

int main()
{
compute(2,3);
compute(4,7);
.
.
.
compute(5,9);
compute(8,5);
return 0;
}

void compute(int a,int b)
{
if(a>b)
cout<<”Variable a is bigger b\n”;
if(a<b)
cout<<” Variable b is bigger a\n”
}


فرض کنید در main 30 بار تابع compute رو فراخوانی کنیم که این خودش باعث کندی برنامه میشه دلیلشم اینه که برای فراخوانی یک تابع باید آدرس تابع فراخوانی شده ذخیره سپس کامپایلر به تابع فراخوانی شده پرش کند و تابع را اجرا کند و پس از اینکه کامپایلر آخرین خط تابعی رو که پرش کرده بود رو اجرا کرد به آدرسی که تابع در main فراخوانی شده بر میگردد (آدرس تابع فراخوانده شده + اجرای تابع + برگشت به آدرس تابع فراخوانده شده) به همین دلایل وقتی به تعداد زیاد تابعی رو فراخوانی میکنیم باعث کندی برنامه خواهد شد

تصویر زیر (telegram.me/Learncpp/426) گویای مطلب هست
@Learncpp
#136
#function #توابع
✅ فرآیند فراخوانی توابع
🔹نحوه فراخوانی تابع, اجرا و برگشت به تابع فراخوانده شده
@Learncpp
#137
#function #توابع
✅ توابع inline در ++C ؟

کامپایلر ++C برای رفع مشکل کپی کردن توابع زمان فراخوانی های مکرر تابعی به نام inline را معرفی و پیشنهاد میکند تابع inline قبل از اسم توابع قرار میگیرد و باعث می شود یک نسخه از دستوراتی که درون تابع قرار دارد در جایی که تابع فراخوانی میشود کپی شود یعنی بجای صدا زدن تابع کد تابع را در جایی که فراخوانی شده (main) کپی شود
@Learncpp
#138
#inline #function #توابع
✅ توابع inline در ++C
@Learncpp
#139
#inline #function
✅ توابع inline در ++C

همانطور که در تصویر (telegram.me/Learncpp/430)می بینید بدنه توابعی که در بیرون از main نوشته بودیم با استفاده از تابع inline در جایی که تابع فراخوانی شده کپی می شود, این کار مثل این است که به جای نوشتن توابع دستورات آن را داخل main بنویسیم
ضعف استفاده از توابع inline این هست که اگر چندین بار یک تابع را فراخوانی کنیم باعث می شود به تعدا فراخوانی بدنه تابع در main کپی شود مثلا تابعی را 30 بار صدا زده باشیم که باعث 30 بار کپی کردن بدنه تابع درون main خواهد شد که باعث افزایش حجم برنامه و کندی برنامه خواهد شد پس در مواردی که تعداد دستورات تابع کم و کوچیکه و لازم نیست به دفعات زیاد در برنامه فراخوانی بشه بهتره از تابع inline استفاده کنیم
@Learncpp
#140
#inline #function #توابع
✅ توابع inline در ++C

مثال)
برنامه ای که چگونگی استفاده از تابع inline را نشان می دهد
#include <iostream>

#include <string>

using namespace std;


int i = 0;

inline void love()

{

cout<<"enter 0 or 1 : ";

cin>>i;

if(i==0)

cout<<"I love world peace\n";

else if (i==1)

cout<<"I hate war,I want peace\n";

else

cout<<"Failure,is variable between 1 or 0\n";

}


int main()

{

love();

love();

love();

love();

love();

return 0;

}

@Learncpp
#141
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

🔹در ++C میتوان برای آرگومان های توابع, مقدار پیش فرض در نظر گرفت یعنی تابعی اگه دو آرگومان داشته باشه بدلیل داشتن مقادیر پیش فرضی که در پارامتر تابع تعریف کردیم میتونیم موقع فراخوانی تابع هیچ مقداری را در آرگومان تابع قرار ندیم یا اگه زمان فراخوانی تابع یادمون رفته باشه به آرگومان ها مقدار بدیم به خاطر استفاده از آرگومانهای پیش فرض, برنامه با خطایی مواجهه نخواهد شد

برای درک بهتر از مطلب بالا به مثال زیر توجه کنید
#include <iostream>

#include <string>

using namespace std;

void default_argument(string help="www.mahak-charity.org\n")

{

  cout<<help;

}

int main()

{

  string site = "Help kids with cancer by dialing *733*23540# \n";

  default_argument(site);

  default_argument();

return 0;

}

در تابع default_argument(site);اگر ما متغییر site رو به عنوان آرگومان به تابع بدیم مقداری خروجی این تابع "Help kids with cancer by dialing *733*23540#" هست ولی اگر به تابع default_argument(); هیچ آرگومانی ندیم مقدار "www.mahak-charity.org"چاپ خواهد شد دلیلشم به خاطر وجود string help="www.mahak-charity.org در پارامتر تابع هست که به عنوان پیش فرض جای آرگومان قرار میگیرد یعنی اگر هنگام فراخوانی آرگومانی به تابع ندیم مقدار پیش فرضی که در پارامتر قرار دارد جایگزین می شود

@Learncpp
#142
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

❌ توجه داشته باشیم که به تعداد آرگومان ها (مساوی یا کمتر), آرگومان پیش فرض تعریف کنیم تا با خطایی از طرف کامپایلر مواجه نشیم
❌ توجه داشته باشیم که ترتیب قرارگیری آرگومانهای پیش فرض درون پارامترها از راست به چپ هست دلیل این کار هم به خاطر اینه که آرگومانهای تابع به ترتیب درون پارامتر قرار می گیرند.

برای درک بهتر مطلب تصویر (telegram.me/Learncpp/435) رو نگاه کنید
@Learncpp
#143
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

@Learncpp
#144
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

🔹همانطور که در تصویر (telegram.me/Learncpp/435) می بینید آرگومان اول در پارامتر اول و آرگومان دوم در پارامتر دوم قرار میگیرد و به خاطراینکه به آرگومان سوم مقداری ندادیم, مقداری پیش فرضی که برای پارامترسوم یعنی 3 در نظر گرفتیم در متغییر num3 قرار میگیرد
@Learncpp
#145
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

🔹همانطور که گفته شد ترتیب قرار گیری پارامترها از راست به چپ هست پس اگه آرگومان های پیش فرض تابع test رو مانند تصویر (telegram.me/Learncpp/438) بنویسیم کامپایلر با خطا مواجه می شود
@Learncpp
#146
#default #argument #function #توابع
✅ آرگومان های پیش فرض در ++C

@Learncpp
#147
#Overloading #function #توابع
✅ سربارگذاری توابع در ++C

🔹بعضی مواقع لازم داریم تابعی داشته باشیم که توانایی داشتن چندین آرگومان رو دارا باشه به زبانه ساده یعنی موقع فراخوانی تابع هم بتونیم مثلا یک آرگومان بهش بدیم هم دوتا و هر تعدادی که نیازه مثلا تابعی نیاز داریم که میانگین چند عدد از نوع صحیح رو حساب کنه و یا میانگین چند عدد اعشاری و برای این کار باید دو تابع جدا با اسم متفاوت بنویسیم تا موقع فراخوانی یک بار تابعی که میانگین اعداد صحیح را حساب میکنه رو صدا بزنیم یکبارم تابعی که محاسبه میانگین اعداد اعشاری رو حساب میکنه. اگه دقت کنید برای محاسبه میانگین دو نوع متفاوت دو تابع جدا نوشتیم.

🔹در ++C میتوانیم از سربارگذاری توابع برای رفع مشکل نوشتن چندین تابع جدا از هم استفاده کرد مثلا اگه به تابع strcpy_s دقت کنید زمان صدا زدن اسمِ تابع strcpy_s, به طور خودکار الگوی تابع مانند تصویر (telegram.me/Learncpp/440) به نمایش در خواهد آمد که شامل نوع تابع, اسم تابع و آرگومانهای تابع هست
@Learncpp
#148
#Overloading #function #توابع
✅ سربارگذاری توابع در ++C

@Learncpp
#149
#Overloading #function #توابع
✅ سربارگذاری توابع در ++C

🔹برای سربارگذاری یک توابع باید یا نوع خروجی تابع یا نوع آرگومانها یا تعداد آرگومانها فرق داشته باشند برای مثال کد زیر رو در نظر بگیرید

int ave(int num1,int num2);

double ave(double num1,double num2);


❌دقت کنیم در سربارگذاری توابع اسم تابع یکسانه ولی حتما باید نوع خروجی تابع یا نوع آرگومانها یا تعداد آرگومانها با هم فرق داشته باشد
@Learncpp
#150
#Overloading #function #توابع
✅ سربارگذاری توابع در ++C

مثال) کد زیر سربارگذاری تابع show رو نمایش میدهد
#include <iostream>

#include <string>

using namespace std;


void show(string name)

{

cout<<name<<endl;

}

void show(string name, string family)

{

cout<<name<<"\t"<<family<<endl;

}

void show(string name, string family,const string color)

{

cout<<name<<"\t"<<family<<"\t"<<color<<endl;

}


int main()

{

show("Ahmad");

show("Ali","Kh...");

show("Mohammad","Kh...","red");

return 0;

}

همانطور که مشاهده می کنید پس از نوشتن اسم تابع(show) آرگومان های تابع هم مانند تصویر (telegram.me/Learncpp/448) نمایش داده می شود
@Learncpp
#151
#Overloading #function #توابع
✅ سربارگذاری توابع در ++C
@Learncpp
#152
#Overloading #function #const #توابع
✅ سربارگذاری توابع در ++C

🔹در سربار گذاری توابع به نکات زیر باید توجه داشت

🔻اگر تابع show را به صورت زیر سربارگذاری کنیم با خطا مواجه می شویم دلیل خطا هم اینه که برای کامپایلر, توابعی که پشت تعریف متغییرهای معمولیش const بهست یا نیست به عنوان یک تابع حساب میکنه و نمیتونه تشخیص بده کدوم تابع رو اجرا کنه
مثلا)
void show(int a)

{ … }


void show(const int a)

{ … }


🔻برای پارامترهای از نوع مرجع و یا اشاره گر به متغیر ثابت، const بودن تفاوت ایجاد میکند
مثلا)
Void show(int &a)

{ … }

Void show(const int &a)

{ … }

و
Void show(int *a)

{ … }

Void show(const int *a)

{ … }

دلیل این که وقتی از ارجاع (&) و اشاره گر (*) استفاده می کنیم و به مشکلی نمی خوریم اینه که که مقادیر آرگومان هایش را تغییر می دهد, اگه بخوام واضح تر بگم اینه که آرگومانهایی که پس از ارسال به پارامتر تابعی اگر قابل تغییر نباشند با خطا روبرو می شوند ولی آرگومان هایی که به پارامتر ارسال می شوند و قابل تغییر هستند با خطایی مواجه نمی شوند
@Learncpp
#153
#template #overloaing
✅قالب توابع (Template) چیست

🔹از قالب ها (الکوها) روی مجموعه ای از داده های مشابه استفاده می شود به زبان ساده می توانیم هر نوع داده ای (آدرس پست) را پس از فراخوانی به عنوان آرگومان Template ارسال کنیم

تو مبحث سربارگذاری توابع (telegram.me/Learncpp/439) متوجه شدیم که هنگام فراخوانی آرگومان های هر توابع از قبل مشخص شده بود برای مثال ممکنه تابعی به نام show داشته باشیم که هم آرگومانهای int دارد هم آرگومانهای float و بسته به نیاز ممکنه نوع های دیگه هم داشته باشیم که میبایست برای هر نوعی تابع جدیدی ایجاد کرد مثلا برنامه ای نیاز هست که پارامترهایی از نوع int , float , string , double و char رو چاپ کند, در سربارگذاری توابع برای این کار باید 5 تابع جدا بنویسیم یعنی

void show(int text)

{ 

cout<<text;

}

void show(float text)

{ 

cout<<text;

}

void show(string text)

{ 

cout<<text;

}

void show(double text)

{ 

cout<<text;

}

void show(char text)

{ 

cout<<text;

}


که این نوع تعریف تابع برای هر نوعی هم حجم کد هارو بیشتر میکنه هم از خوانایی برنامه کم میکند پس ++C برای رفع این مشکل template ها رو معرفی کرد
@Learncpp
#154
#template #overloaing
✅قالب توابع (Template)

🔹نحوه تعریف template در ++C
Template <class type>

Type function_name(type argumenets)

{

Orders;

}

❌ بجای کلمه کلیدی class میتوان از typename استفاده کرد

❌ نوع بازگشتی تابع template می تواند از نوع type باشد یا هرنوعی که خودمون براش تعیین می کنیم مثلا نوع داده type از نوع int هست ولی ما می توانیم نوع بازگشتی را string در نظر بگیریم

🔹حرف type
در اینجا type حکم یکی از انواع داده هارو (telegram.me/Learncpp/91) داره یعنی اینکه بسته به نوعی که در همگام فراخوانی تابع درون main به آرگومان تابع داده میشود type نیز خود را با نوع ارسال شده تطابق میده به زبان ساده اگه هنگام فراخوانی نوع متغییر int باشد کامپایلر type رو از نوع int در نظر می گیرد یا اگه هنگام فراخوانی نوع متغییر string باشد type هم string در نظر گرفته می شود برای درک مطلب به مثال () توجه کنید

@Learncpp
#155
#template #overloaing
✅قالب توابع (Template)

مثال) با استفاده ازtemplate برنامه ای بنویسید که هنگام فراخوانی هر نوع داده ای را گرفته و آن را چاپ کند

#include <iostream>

using namespace std;


template <class T>

void show(T txt)

{

cout << txt << endl;

}


int main()

{

show(12345);

show("@Learncpp");

show(12.34);

show('A');

return 0;

}


در مثال بالا برای type از نام T استفاده کردیم این به این معنی هست که هر نوع داده ای (آدرس پست) که در main هنگام فراخوانی به آرگومان تابع داده باشیم جای T قرار خواهد گرفت مثلا اگه به آرگومان تابع رشته داده باشیم کامپایلر Tرا به عنوان string در نظر خواهد گرفت

تصویر (telegram.me/Learncpp/453) گویای مطلب بالاست
@Learncpp