أداة البناء Constructors

وقت القراءة: 7 دقائق 866 مشاهدة

ما هو الـConstructor؟
في لغة C++، الـconstructor هو دالة عضو خاصة داخل فئة class يتم استدعاؤها تلقائيًا عند إنشاء كائن object من تلك الفئة. والغرض الأساسي منه هو تهيئة أعضاء بيانات الكائن object أو إجراء أي إعداد ضروري للكائن. يتأكد المنشئون من أن الكائن يبدأ بحالة صالحة.

  1. اسم الـConstructor:
    الـConstructors لديهم نفس اسم الـclass الذي ينتمون إليه.
  2. لا توجد قيمة إرجاع:
    لا يُرجع الـConstructors أي قيمة، ولا حتى void.
  3. إعطاء قيمة للـobject:
    يتم استخدام الـConstructors لإنشاء object جديد وإعداده.

أنواع الـConstructors:

  1. Default/ Empty Constructor:
    يتم إنشاؤه تلقائيًا بواسطة المترجم compiler إذا لم يتم تعريف أي constructor بشكل صريح.
    إنشاء أعضاء الـobject بإستخدام قيم إفتراضية.
    بناء الجملة: ClassName() { /* Initialization code */ }
    مثال 1:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    class Triangle
    {
        private:
            int base;
            int height;
        public:
            //empty constructor, no arguments are required
            Triangle()
            {
                cout << "first constructor\n";
            }
            void setBase_Height(int b, int h)
            {
                base = b;
                height =h;
            }
            float area()
            {
                return 0.5*base*height;
            }
            void print()
            {
                cout << "base = " << base << endl
                     << "height = " << height << endl
                     << "area = " << area() << endl;
            }
    };
    int main()
    {
        Triangle ob;
        ob.setBase_Height(10, 5);
        ob.print();
    
        return 0;
    }

    تم تعريف (empty constructor) (Triangle()). يتم استدعاؤه تلقائيًا عند إنشاء object وطباعة "first constructor".

  2. Parameterized Constructor:
    يقبل parameters أثناء إنشاء الـobject لتخصيص الحالة الأولية.
    يوفر المرونة للـobjects للبدء بقيم مختلفة.
    بناء الجملة: ClassName(type param1, type param2, …) { /* Initialization code */ }
    مثال 2:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    class Triangle
    {
        private:
            int base;
            int height;
        public:
            //empty constructor, no arguments are required
            Triangle()
            {
                cout << "first constructor\n";
                base = 0;
                height = 0;
            }
            //parameterized constructor
            Triangle(int b, int h)
            {
                base = b;
                height = h;
                cout << "parameterized constructor\n";
            }
            void setBase_Height(int b, int h)
            {
                base = b;
                height = h;
            }
            float area()
            {
                return 0.5*base*height;
            }
            void print()
            {
                cout << "base = " << base << endl
                     << "height = " << height << endl
                     << "area = " << area() << endl;
            }
    };
    int main()
    {
        Triangle ob(5, 10);
        //ob.setBase_Height(10, 5);
        ob.print();
    
        return 0;
    }
    

    Parameterized Constructor:

    يقبل (parameters) (int b وint h) للتهيئة المخصصة.
    يطبع “parameterized constructor” عندما يتم إستدعاؤه.
    يتم استخدام The parameterized constructor أثناء إنشاء الكائن object، مما يوفر قيمًا أولية لأعضاء القاعدة والارتفاع.

مثال 3:

#include <iostream>
#include <cstdlib>
using namespace std;
class student {
    private:
        char name[20];
        int id;
    public:
        student()
        {
            strcpy_s(name, "no name");
            id = 0;
        }
        student(char n[], int i)
        {
            cout << "parameterized constructor\n";
            strcpy_s(name, n);
            id = i;
        }
        student(char n[])
        {
            strcpy_s(name, n);
        }
        void print()
        {
            cout << "name = " << name << endl;
            cout << "id = " << id << endl;
        }
};
int main()
{
    student ob("Mohammed", 1450902032);
    ob.print();

    return 0;
}

يحدد هذا الرمز طالبًا في الفصل يمثل طالبًا له اسم ومعرف متغيرات الأعضاء الخاصة. تتضمن الفئة ثلاثة (constrctors): empty constructor, parameterized constructor بالاسم والمعرف، وparameterized constructor بالاسم فقط. دعونا نحلل الكود خطوة بخطوة:

– تعريف الـ(Class): student

class student {
private:
    char name[20];
    int id;

public:
    // Empty Constructor
    student() {
        strcpy_s(name, "no name");
        id = 0;
    }

    // Parameterized Constructor (with name and id)
    student(char n[], int i) {
        cout << "parameterized constructor\n";
        strcpy_s(name, n);
        id = i;
    }

    // Parameterized Constructor (with name only)
    student(char n[]) {
        strcpy_s(name, n);
    }

    // Member Function to print student details
    void print() {
        cout << "name = " << name << endl;
        cout << "id = " << id << endl;
    }
};
  • Empty Constructor:
    تهيئة الاسم إلى "no name" والمعرف إلى 0.
  • Parameterized Constructor (بالإسم والمعرف):
    يقبل parameters (char n[] and int i).
    يطبع “parameterized constructor” عندما يتم إستدعاؤه.
    يعين الاسم والمعرف بناءً على القيم المُدخلة.
  • Parameterized Constructor (بالإسم فقط):
    يقبل parameter (char n[]).
    تهيئة سمة الاسم فقط.
  • أعضاء الـFunction:
    print: يعرض اسم الطالب وهويته.

الدالة الرئيسة main:

int main() {
    // Object of class student created using the parameterized constructor with name and id
    student ob("Mohammed", 1450902032);

    // Printing the details of the student
    ob.print();

    return 0;
}
  • إنشاء الكائن object:
    يتم إنشاء كائن ob من النوع Student باستخدام الـparameterized constructor بكل من الاسم والمعرف.
  • تفاصيل الطباعة:
    يتم استدعاء دالة عضو الطباعة لعرض تفاصيل الطالب بما في ذلك الاسم والمعرف.

مخرجات هذا البرنامج ستكون كالتالي:

parameterized constructor
name = Mohammed
id = 1450902032

يوضح هذا الكود استخدام constructors متعددة في فئة C++. اعتمادًا على الـarguments المتوفرة أثناء إنشاء الكائن، يمكن استدعاء constructors مختلفة لتهيئة الكائن وفقًا لذلك.

3. Copy Constructor:

مثال 4:

#include <iostream>
using namespace std;
class Copy {
    private:
        int a1, a2, a3, a4, a5, a6, a7, a8;
    public:
        Copy(int aa1, int aa2, int aa3, int aa4,
            int aa5, int aa6, int aa7, int aa8)
        {
            a1 = aa1;
            a2 = aa2;
            a3 = aa3;
            a4 = aa4;
            a5 = aa5;
            a6 = aa6;
            a7 = aa7;
            a8 = aa8;
        }
        Copy(const Copy &a)
        {
            a1 = a.a1;
            a2 = a.a2;
            a3 = a.a3;
            a4 = a.a4;
            a5 = a.a5;
            a6 = a.a6;
            a7 = a.a7;
            a8 = a.a8;
        }
        void print()
        {
            cout << a1 << " " << a2 << " " << a3 << " " << a4 << " "
                 << a5 << " " << a6 << " " << a7 << " " << a8 << " " << endl;
        }
};
int main()
{
    Copy g(1, 2, 3, 4, 5, 6, 7, 8);
    g.print();
    Copy h(g);
    h.print();

    return 0;
}

يحدد هذا الكود نسخة فئة مع constructors اثنين - أحدهما لتهيئة كائن بقيم محددة والآخر لإجراء نسخة عميقة من كائن موجود. دعونا نحلل الكود:

– تعريف الـ(Class): Copy

class Copy {
private:
    int a1, a2, a3, a4, a5, a6, a7, a8;

public:
    // Parameterized Constructor for Initialization
    Copy(int aa1, int aa2, int aa3, int aa4,
         int aa5, int aa6, int aa7, int aa8) {
        a1 = aa1;
        a2 = aa2;
        a3 = aa3;
        a4 = aa4;
        a5 = aa5;
        a6 = aa6;
        a7 = aa7;
        a8 = aa8;
    }

    // Copy Constructor for Deep Copy
    Copy(const Copy &a) {
        a1 = a.a1;
        a2 = a.a2;
        a3 = a.a3;
        a4 = a.a4;
        a5 = a.a5;
        a6 = a.a6;
        a7 = a.a7;
        a8 = a.a8;
    }

    // Member Function to Print Object Details
    void print() {
        cout << a1 << " " << a2 << " " << a3 << " " << a4 << " "
             << a5 << " " << a6 << " " << a7 << " " << a8 << " " << endl;
    }
};
  • Parameterized Constructor:
    تهيئة الكائن بقيم محددة مقدمة كـarguments.
  • Copy Constructor:
    إجراء نسخة عميقة من كائن موجود (Copy &a).
    نسخ كل متغير عضو للكائن المصدر إلى الكائن الجديد.
  • دالة Print:
    يعرض قيم متغيرات أعضاء الكائن.

الدالة الرئيسة main:

int main() {
    // Creating an object 'g' and initializing it with specific values
    Copy g(1, 2, 3, 4, 5, 6, 7, 8);
    
    // Printing the details of object 'g'
    g.print();

    // Creating another object 'h' and initializing it by performing a deep copy of 'g'
    Copy h(g);

    // Printing the details of object 'h'
    h.print();

    return 0;
}
  • إنشاء الكائن (g):
    يتم إنشاء كائن g من النوع Copy وتهيئته بقيم محددة.
  • تفاصيل الطباعة (g):
    يتم استدعاء دالة عضو الطباعة لعرض تفاصيل الكائن g.
  • إنشاء الكائن (h):
    يتم إنشاء كائن h آخر وتهيئته عن طريق إجراء نسخة عميقة من الكائن g باستخدام copy constructor.
  • تفاصيل الطباعة (h):
    يتم استدعاء دالة عضو الطباعة لعرض تفاصيل الكائن h.

مخرجات هذا البرنامج ستكون كالتالي:

1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 

يوضح هذا الكود استخدام copy constructor لإنشاء كائن جديد بنفس قيم كائن موجود، مما يضمن نسخة عميقة من البيانات.

مشاركة هذا

أداة البناء Constructors

Or copy link

المحتوى
Arabic