أساسيات الـ 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).
التحدي
متوسطقم بإنشاء فئة 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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامة