Learning ©➕➕
4.52K subscribers
81 photos
2 videos
38 files
182 links
ک
Download Telegram
#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
#155
#template #overloaing
✅قالب توابع (Template)
نحوه تعیین نوع داده از طریق مقادیر آرگومان ها
@Learncpp
#156
#template #overloaing
✅قالب توابع (Template)

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

using namespace std;


template <class T>

T show(T txt)

{

T sum=txt;

return sum;

}


int main()

{

cout << show(12345);

cout << show("@Learncpp");

cout << show(12.34);

cout << show('A');

return 0;

}

در کد بالا همانطور که مشاهده می کنید نوع بازگشتی تابع show از نوع Tهست یعنی نوع بازگشتی تابع show به مقداری که در آرگومان قرار می گیرد بستگی دارد, اگر در آرگومان رشته قرار بدیم نوع بازگشتی(همانT قبل از اسم تابع) string هست یا اگر در آرگومان عدد اعشار قرار دهیم نوع بازگشتی هم اعشار هست
@Learncpp
#157
#template #overloaing
✅قالب توابع (Template)

❌ در Template ها می توانیم بیش از یک پارامتر داشته باشیم مانند کد زیر:
template <class T1,class T2,class T3>

void show(T1 x,T2 y,T3 z)

{

cout<<x<<" "<<y<<" "<<z;

}

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

🔹تعریف مجدد توابع کلی

🔻منظور از تعریف مجدد اینه که فرض کنیم یک تابع template به اسم sum داریم بعدش خودمون بیایم یک تابع دیگه (تابع معمولی) به اسم sum ایجاد کنیم به این کار تعریف مجدد توابع کلی می گویند مثلا
template <class T>

void show(T txt)

{ … }


void show(char txt)

{ … }

خوب کامپایلر از کجا باید تشخیص دهد کدام تابع را باید اجرا کند؟ در این شرایط کامپایلر همیشه تابع معمولی را اجرا کرده و قالب تابع را نادیده می گیرد
@Learncpp
#159
#template #overloaing
✅ قالب توابع (Template)
🔹تعریف مجدد توابع کلی

مثال) برنامه زیر نحوه تعریف مجدد یک تابع را نمایش می دهد
#include <iostream>

#include <string>

using namespace std;


template <class T>

void show(T txt)

{

cout<<"template"<<endl;

cout<<txt;

}


void show(char txt)

{

cout<<"function"<<endl;

cout << txt;

}


int main()

{

show('a');

return 0;

}

خروجی برنامه:
function
a
@Learncpp
#160
#template #overloaing
✅قالب توابع (Template)
🔹تعریف مجدد توابع کلی

❌ گاهی اوقات لازمه موقع فراخوانی تابع به کامپایلر بگیم که چه نوعی رو برای قالب تابع ارسال کند برای مثال فقط نوع int را template فرستاده شود که برای این کار از الگوی زیر استفاده می کنیم
function_name<type>(argumenet);

مثال) برنامه ای بنویسید که موقع فراخوانی فقط نوع int به template پاس داده شود
#include <iostream>

using namespace std;


template <class T>

void show(T number)

{

cout<<number;

}


int main()

{

show<int>('a');

return 0;

}

همانطور که در کد بالا دیدید کد show <int> ('a'); باعث می شود تا کد اسکی کاراکتر a به template فرستاده شود دلیل این کارم به خاطره اینه که ما(برنامه نویس) به کامپایلر دستور میدیدم که حتما باید آرگومان ارسالی از نوع int باشد
@Learncpp
#161
#template #overloaing
✅قالب توابع (Template)

🔹تعریف مجدد template ها

🔻منظور از تعریف مجدد template ها یعنی اینکه یک template به اسم func داریم و میخوایم یک template دیگه با همین اسم ایجاد کنیم برای این کار باید تعداد پارامتر های template ها با هم تفاوت داشته باشند برای مثال قالب های زیر از نظر تعداد پارامترها با هم متفاوتند
template <class T1>


template <class T1,class T2>

@Learncpp