English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
دليل مرجعي C++
في هذا المقال، ستعلم النماذج في C++ وسوف تتعلم كيفية استخدام ميزات النماذج للبرمجة العامة.
النموذج هو ميزة قوية في C++، تتيح لك كتابة برامج عامة.
يستخدم النموذج عادةً في مكتبات برمجية كبيرة، ويهدف إلى تحقيق إعادة الاستخدام البرمجي وتحقيق مرونة في البرنامج.
فكرة النموذج يمكن استخدامها بطرقين مختلفين:
Class templates
وظيفة النموذجتعمل وظيفة النموذج بنفس الطريقة مثلوظيفة
مثل، ولكن هناك فرق.
عادةً، إذا كنت بحاجة إلى تنفيذ نفس العمليات على أنواع بيانات متعددة، يمكنك إنشاء دعتين باستخدام دالة التحميل لإنشاء بيانات دالة مطلوبة.
لكن الطريقة الأفضل هي استخدام نموذج الوظيفة، لأنك يمكنك تنفيذ نفس المهمة باستخدام كود أقل.
تبدأ وظيفة النموذج بكلمة مفتاحية template، تتبعها <> التي تحتوي على معاملات النموذج، ثم بيان دالة.
template <class T> T someFunction(T arg) { ... .. ... }
في الكود المقدم، هو معامل نموذج يتقبل أنواع بيانات مختلفة (مثل int،float،وإلخ)،classهي كلمة مفتاحية.
في المثال السابق، يمكنك أيضًا استخدام الكلمة المفتاحية typename بدلاً من class.
عند إرسال نوع البيانات كمعامل لنوع الوظيفة، ينتج المبرمج نوع وظيفة جديدة لنوع البيانات المحدد.
يستخدم البرنامج نموذج الوظيفة لعرض أكبر رقم من الرقمين.
// إذا تم إرسال حرفين إلى نموذج الوظيفة، يتم عرض الحرف ذي القيمة الأكبر في ASCII. #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 << "ادخل رقمين صحيحين:\n"; cin >> i1 >> i2; cout << Large(i1, i2) << " أكبر. " << endl; cout << "\nادخل رقمين عشريين:\n"; cin >> f1 >> f2; cout << Large(f1, f2) << " أكبر. " << endl; cout << 输入两个字符: ; cin >> c1 >> c2; cout << Large(c1, c2) << 具有较大的ASCII值。; العودة 0; }
الناتج
输入两个整数: 5 10 10 is larger. 输入两个浮点数: 12.4 10.2 12.4 is larger. 输入两个字符: z Z z 具有较大的ASCII值。
在上面的程序中,定义了一个函数模板Large(),它接受数据类型为T的两个参数n1和n2。T表示这个参数可以是任何数据类型。
Large()函数使用简单的条件操作返回两个参数中最大的一个。
在main()函数内部,声明了三种不同数据类型的变量:int,float和char。 然后将变量作为普通函数传递给Large()函数模板。
在运行时,将整数传递给模板函数时,编译器知道必须生成一个Large()函数来接受int参数,并且也是这样做的。
同样,当传递浮点数据和char数据时,它知道自变量数据类型并相应地生成Large()函数。
这样,仅使用一个函数模板即可替换三个相同的常规函数,并使您的代码更少也更容易维护。
程序使用函数模板交换数据。
#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 << 在将数据传递给函数模板之前。 ; cout << i1 = << i1 << i2 = << i2; cout << f1 = << f1 << f2 = << f2; cout << c1 = << c1 << c2 = << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << 将数据传递给函数模板后。 ; cout << i1 = << i1 << i2 = << i2; cout << f1 = << f1 << f2 = << f2; cout << c1 = << c1 << c2 = << c2; العودة 0; }
الناتج
在将数据传递给函数模板之前。 i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b After passing data to the function template. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
In this program, the function is not called by passing values, butBy referenceMake a call.
The Swap() function template accepts two parameters and swaps them by reference.
Just like function templates, you can also create class templates for generic class operations.
Sometimes, you need a class implementation that applies to all classes, but the data types used are different.
通常,您需要为每种数据类型创建一个不同的类,或者在一个类中创建不同的成员变量和函数。
This will add very similar code, and it will be difficult to maintain.
However, class templates make it easier to reuse the same code for all data types.
template <class T> class className { ... .. ... public: T var; T someOperation(T arg); ... .. ... };
In the above declaration, T is a template parameter, which is a placeholder for the data type used.
In the class, member variable var and member function someOperation() are both of type T.
To create an object of class template, you need to define the data type within the < > when creating it.
className<dataType> classObject;
For example:
className<int> classObject; className<float> classObject; className<string> classObject;
The program uses class template to perform addition, subtraction, multiplication, and division operations on two numbers.
#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 << "الناتج الناقص هو: " << subtract() << endl; cout << "الناتج المضروب هو: " << multiply() << endl; cout << "تقسيم هو: " << 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:" << endl; intCalc.displayResult(); cout << endl << "نتائج float:" << endl; floatCalc.displayResult(); العودة 0; }
الناتج
نتائج int: الرقمان هي: 2 و1. الناتج الإضافي هو: 3 الناتج الناقص هو: 1 الناتج المضروب هو: 2 تقسيم هو: 2 نتائج float: الرقمان هي: 2.4 و1.2. الناتج الإضافي هو: 3.6 الناتج الناقص هو: 1.2 الناتج المضروب هو: 2.88 تقسيم هو: 2
في البرنامج أعلاه، تم إعلان نموذج فئة Calculator.
تتضمن هذه الفئة عضوين خاصين من نوع T: num1 وnum2، بالإضافة إلى بناء الجسم المخصص لتكوين العضوين.
ويحتوي أيضًا على وظائف عامة لتحليل إضافة، طرح، ضرب واقسم الرقم، ليعيد القيمة من النوع البيانات المحدد من قبل المستخدم. بالإضافة إلى ذلك، ستعرض دالة displayResult() النتيجة النهائية على الشاشة.
في دالة main()، أنشئت اثنين من كائنات Calculator المختلفة من نوع البيانات int وfloat: int وfloat. استخدم بناء الجسم لتكوين القيم.
الاشارة إلى أننا نستخدم <int> و <float> أثناء إنشاء الرموز. هذه تعليمات للمعالج لاستخدام نوع البيانات المطلوب لإنشاء الفئة.
سيتم إنشاء تعريف فئة لـ int و float على التوالي، ثم استخدامها.
ثم، يتم دعوة كلا الرموز displayResult()
ثم، تُدعى هاتين الرموز displayResult()، التي تقوم بعمليات الحساب وتظهر الناتج.