با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با یکی دیگر از جلسات دوره کامل آموزش ++C در خدمت شما دوستان هستیم . در بخش قبلی با توابع مجازی در ++C آشنا شدید، در این جلسه قصد داریم به آموزش الگو ها در ++C یا Templates در ++c و شی الگوی کلاس در سی پلاس پلاس بپردازیم.
الگو ها یا قالب ها یکی از ویژگی های قدرتمند زبان ++C می باشد که این امکان را به ما می دهد تا برنامه هایمان را به صورت عمومی بنویسیم.
به عبارت دیگر با استفاده از الگو ها می توانیم تابع یا کلاسی تعریف کنیم که با انواع مختلف داده ها کار کند.
الگو ها معمولا در پروژه های بزرگ به منظور استفاده مجدد از کد و انعطاف پذیری برنامه ها استفاده می شود.
مفهوم الگو ها در دو روش متفاوت استفاده می شود:
یک الگوی تابع (Function Template) یا قالب تابع شبیه به توابع معمولی کار می کند اما با یک تفاوت.
یک الگوی تابع می تواند در یک زمان با چندین نوع داده کار کند اما یک تابع معمولی می تواند فق با یک نوع داده کار کند.
به طور معمول اگر بخواهید اعمال یکسانی را روی دو یا چند نوع داده انجام دهید، از سربارگذاری توابع برای ایجاد چند تابع با تعاریف لازم استفاده خواهید کرد.
با این حال یک روش بهتر استفاده الگو ها خواهد بود زیرا می توانید اعمال یکسانی را با یک تابع انجام دهید.
یک الگوی تابع با کلمه کلیدی template آغاز می شود و به دنبال آن پارامتر های الگو داخل < > می آیند و بعد آن تعریف تابع نوشته می شود.
1 2 3 4 5 | template <class T> T someFunction(T arg) { ... .. ... } |
در مثال بالا T یک آرگومان الگو است که انواع داده مختلفی را قبول می کند.
class نیز یک کلمع کلیدی است که می توانید به جای آن از کلمه typename هم استفاده کنید.
برنامه زیر بزرگترین مقدار دو عدد را با استفاده از الگوی تابع نمایش می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> using namespace std; // template function template <class T> T Large(T n1, T n2) { return (n1 > n2) ? n1 : n2; } int main() { int i1, i2; float f1, f2; char c1, c2; cout << "Enter two integers:\n"; cin >> i1 >> i2; cout << Large(i1, i2) <<" is larger." << endl; cout << "\nEnter two floating-point numbers:\n"; cin >> f1 >> f2; cout << Large(f1, f2) <<" is larger." << endl; cout << "\nEnter two characters:\n"; cin >> c1 >> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; } |
خروجی به شکل زیر می باشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Enter two integers: 5 10 10 is larger. Enter two floating-point numbers: 12.4 10.2 12.4 is larger. Enter two characters: z Z z has larger ASCII value. |
در بالا الگو تابع ()Large را تعریف کرده ایم که دو پارامتر از نوع T را می گیرید. نوع T می تواند هر نوع داده ای باشد.
در طول زمان اجرا هنگامی که یک integer به تابع ارسال می شود، کامپایلر یک تابع ()Large برای پذیرفتن آرگومان های int تولید میکند.
به طور مشابه برای هر نوع داده ای نیز همین کار را خواهد کرد.
برنماه زیر دو مقدار دو متغیر را با هم جا به جا می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> using namespace std; template <typename T> void Swap(T &n1, T &n2) { T temp; temp = n1; n1 = n2; n2 = temp; } int main() { int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template.\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "\n\nAfter passing data to function template.\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; return 0; } |
خروجی:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Before passing data to function template. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b After passing data to function template. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a |
مانند الگو های تابع، می توانید الگو های کلاس یا قالب های کلاس ایجاد کنید.
گاهی اوقات نیاز داریم تا کلاسی را پیاده سازی کنیم که که برای تمام کلاس ها یکسان است و فقط انواع داده استفاده شده متفاوت هستند.
به طور معمول شما چندین کلاس متفاوت برای هر نوع داده ایجاد می کنید یا داخل یک کلاس توابع مختلف برای انواع داده مختلف پیاده سازی می کنید.
به هر حال استفاده از الگوی کلاس بهترین روش برای پیاده سازی این نگونه کلاس ها هست.
1 2 3 4 5 6 7 8 9 | template <class T> class className { ... .. ... public: T var; T someOperation(T arg); ... .. ... }; |
در مثال بالا T یک نگهدارنده انواع مختلف داده است.
برای ایجاد یک شی از الگوی کلاس باید نوع داده را داخل < > هنگام ایجاد شی تعریف کنیم.
1 | className<dataType> classObject; |
برای مثال:
1 2 3 | className<int> classObject; className<float> classObject; className<string> classObject; |
در برنامه زیر جمع، تفریق، ضرب و تقسیم دو عدد را با استفاده از قالب کلاس پیاده سازی کرده ایم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> using namespace std; template <class T> class Calculator { private: T num1, num2; public: Calculator(T n1, T n2) { num1 = n1; num2 = n2; } void displayResult() { cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; } T add() { return num1 + num2; } T subtract() { return num1 - num2; } T multiply() { return num1 * num2; } T divide() { return num1 / num2; } }; int main() { Calculator<int> intCalc(2, 1); Calculator<float> floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; } |
خروجی به شکل زیر می باشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 |
جلسه آموزش الگو ها در ++C و سری جلسات آموزش زبان برنامه نویسی ++C نیز به پایان رسید.
امیدواریم این آموزش ها مفید واقع شده باشند.
sara
خیلی عالی بود.ممنون
محمد
عالــی بود
ممنون
محمد
عالی بود.
خیلی خوب و روان توضیح داده بودید.
ممنون
صادق
خواهش می کنم. خوشحالیم مورد رضایت شما واقع شده
دانشجو
خیلی عالی بود
saara
سایت خیلی خوبی دارید
امیدوارم موفق باشید