Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أساسيات الـ Ctors والـ Dtors

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 10 من 104.

المُنشئ (constructor) هو طريقة خاصة تعمل تلقائيًا عند إنشاء كائن (object). أما المُهدم (destructor) فيعمل عند تدمير الكائن.

المُنشئ الافتراضي (Default constructor)

class Book {
private:
    std::string title;
    int pages;

public:
    Book() {
        this->title = "Unknown";
        this->pages = 0;
    }
};

منشئ ذو معاملات (Parameterized constructor)

Book(std::string title, int pages) {
    this->title = title;
    this->pages = pages;
}

زيادة تحميل المنشئ (Constructor overloading) — منشئات متعددة

class Book {
private:
    std::string title;
    int pages;

public:
    Book() {
        this->title = "Unknown";
        this->pages = 0;
    }
    
    Book(std::string title) {
        this->title = title;
        this->pages = 0;
    }
    
    Book(std::string title, int pages) {
        this->title = title;
        this->pages = pages;
    }
};

المُهدم (Destructor) — يتم تشغيله عند تدمير الكائن

class Book {
public:
    ~Book() {
        std::cout << "Book destroyed" << std::endl;
    }
};

إنشاء كائنات باستخدام منشئات مختلفة

Book book1;                        // منشئ افتراضي
Book book2("Harry Potter");         // معامل واحد
Book book3("1984", 328);            // معاملان

تمتلك المنشئات (Constructors) نفس اسم الفئة (class) بدون نوع إرجاع. تستخدم المهدمات (Destructors) ~ClassName() ويتم استدعاؤها تلقائيًا بترتيب عكسي لعملية الإنشاء عندما تخرج الكائنات (objects) عن النطاق (scope).

challenge icon

التحدي

متوسط

قم بإنشاء فئة Product تحتوي على ثلاثة منشئات (constructors) محملة بشكل زائد (overloaded) ومُهدم (destructor):

  • منشئ بـ 3 معاملات: name، و price، و stock
  • منشئ بمعاملين: name، و price (بحيث stock = 0)
  • منشئ افتراضي: name = "Unknown"، و price = 0، و stock = 0
  • المُهدم (Destructor): يطبع "Destroying: <name>"

ورقة مرجعية

الـ constructor (المُنشئ) هو طريقة خاصة تعمل تلقائياً عند إنشاء كائن. أما الـ destructor (المُهدم) فيعمل عند تدمير الكائن.

Default constructor (المُنشئ الافتراضي) — يقوم بالتهيئة بقيم افتراضية:

class Book {
private:
    std::string title;
    int pages;

public:
    Book() {
        this->title = "Unknown";
        this->pages = 0;
    }
};

Parameterized constructor (المُنشئ ذو المعاملات) — يقبل معاملات:

Book(std::string title, int pages) {
    this->title = title;
    this->pages = pages;
}

Constructor overloading (تحميل المُنشئ الزائد) — وجود عدة مُنشئات بمعاملات مختلفة:

class Book {
private:
    std::string title;
    int pages;

public:
    Book() {
        this->title = "Unknown";
        this->pages = 0;
    }
    
    Book(std::string title) {
        this->title = title;
        this->pages = 0;
    }
    
    Book(std::string title, int pages) {
        this->title = title;
        this->pages = pages;
    }
};

Destructor (المُهدم) — يعمل عند تدمير الكائن، ويستخدم ~ClassName():

class Book {
public:
    ~Book() {
        std::cout << "Book destroyed" << std::endl;
    }
};

إنشاء الكائنات باستخدام مُنشئات مختلفة:

Book book1;                        // المُنشئ الافتراضي
Book book2("Harry Potter");         // معامل واحد
Book book3("1984", 328);            // معاملان

تمتلك المُنشئات نفس اسم الفئة (class) ولا تحتوي على نوع إرجاع. يتم استدعاء المُهدمات تلقائياً بترتيب عكسي لترتيب الإنشاء عندما ينتهي نطاق الكائنات.

جرّب بنفسك

#include <iostream>
#include "Product.h"

int main() {
    std::string name;
    int price, stock;
    std::getline(std::cin, name);
    std::cin >> price >> stock;
    
    Product product1(name, price, stock);
    Product product2("Keyboard", 79);
    Product product3;
    
    std::cout << "Product 1: " << product1.getName() << " - $" << product1.getPrice() << " (Stock: " << product1.getStock() << ")" << std::endl;
    std::cout << "Product 2: " << product2.getName() << " - $" << product2.getPrice() << " (Stock: " << product2.getStock() << ")" << std::endl;
    std::cout << "Product 3: " << product3.getName() << " - $" << product3.getPrice() << " (Stock: " << product3.getStock() << ")" << std::endl;
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming