C++ مفهوم الكونستركتور

أهمية الكونستركتور في C++

من أهم الأشياء التي عليك التفكير بها عند إنشاء كلاس جديد, هي تسهيل طريقة إنشاء كائنات من هذا الكلاس لاحقاً.
من هنا جاءت فكرة الكونستركتور ( Constructor ) و الذي هو عبارة عن دالة, يتم إستدعائها أثناء إنشاء كائن من الكلاس لإعطاء قيم أولية للخصائص الموجودة فيه.

أيّ كلاس تقوم بتعريفه, يملك كونستركتور إفتراضي حتى لو تقم بتعريفه له بنفسك و سبب ذلك أنه لا يمكن إنشاء كائن من كلاس إلا من خلال كونستركتور هذا الكلاس.
لهذا إن لم تقم بتعريف كونستركتور للكلاس بنفسك, فكن على يقين أن مترجم لغة C++ سيقوم بإنشاء كونستركتور إفتراضي فارغ بدلاً عنك عندما تحاول إنشاء كائن من الكلاس.


نقاط مهمة حول الكونستركتور

  • كل كلاس يتم إنشاؤه يحتوي على كونستركتور واحد على الأقل. و حتى إن لم تقم بتعريف أي كونستركتور, سيقوم المترجم بإنشاء واحد إفتراضي.
  • في كل مرة يتم إنشاء كائن جديد من كلاس, يجب استدعاء كونستركتور من الكلاس حتى يتم إنشاء هذا الكائن.
  • القاعدة الأساسية عند تعريف كونستركتور هي أنه يجب أن يحمل نفس إسم الكلاس و يكون نوعه public.
  • في حال قمت بتعريف كونستركتور, لن يقوم المترجم بإنشاء واحد إفتراضي, أي لن يعود هناك كونستركتور إفتراضي.
  • يمكنك تعريف أكثر من كونستركتور. و يمكنك دائماً إنشاء كونستركتور فارغ, حتى تستخدمه إن كنت لا تريد إعطاء قيم أولية محددة للخصائص عند إنشاء كائن.


في المثال التالي قمنا بتعريف كلاس إسمه Book و لم نقم بتعريف كونستركتور له.

المثال الأول

class Book {

} 
		

سيقوم المترجم بإنشاء كونستركتور فارغ بشكل تلقائي عنا كالتالي.

class Book {

public:
	// هذا كونستركتور إفتراضي أنشأه المترجم لأن الكلاس لا يحتوي على أي كونستركتور
	Book() {
		
	}

} 
		

طريقة استدعاء الكونستركتور في C++

عند استدعاء كونستركتور موجود في كلاس, يجب أن تمرر قيمة لكل باراميتر موجود فيه من خلال وضع قوسين بعد إسم الكائن و تمرير القيم فيه.
فيما ويلي وضعنا بعض الأمثلة التي توضح كيفية إستتدعاء كونستركتور من الكلاس.


إذا كان إسم الكونستركتور هكذا Book() فإنك لا تحتاج فعل أي شيء حين تنشئ كائن من الكلاس حيث تنشئه كالتالي.

المثال الأول

Book book;
		

إذا كان إسم الكونستركتور هكذا Book(string title) فإنك مجبر على تمرير قيمة لكونستركتور الكائن كالتالي عند إنشاءه كالتالي.

المثال الثاني

Book book("C++ for beginners");
		

إذا كان إسم الكونستركتور هكذا Book(string title, string author) فإنك مجبر على تمرير قيم لكونستركتور الكائن كالتالي عند إنشاءه كالتالي.

المثال الثالث

Book book("C++ for beginners", "Mhamad Harmush");
		

إذا كان إسم الكلاس يحتوي على كونستركتور فارغ Book() و كونستركتور يأخذ قيمتين هكذا Book(string title, string author) فهنا تكون مخيّر على استدعاء الكونستركتور الذي تريده منهما عند إنشاء كائن من الكلاس.

المثال الرابع

// يمكنك أن تنشئ الكائن من خلال استدعاء الكونستركتور الأول كالتالي
Book book();

// و يمكنك أن تنشئ الكائن من خلال استدعاء الكونستركتور الثاني كالتالي
Book book("C++ for beginners", "Mhamad Harmush");
		

مثال شامل حول التعامل مع الكونستركتور في C++

في المثال التالي, قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book قمنا بتعريف كونستركتور يمكننا من خلاله إدخال قيم مباشرةً للخصائص الموجودة في أي كائن ننشئه من الكلاس.
كما أننا قمنا بتعريف دالة إسمها printInfo() عند استدعاءها تقوم بطباعة قيم الخصائص التي يمكلها أي كائن ننشئه من الكلاس.

مثال

main.cpp
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
	// هنا قمنا بتعريف خصائص الكلاس
	string title;
	string author;
	double price;
	int numberOfPages;
	
	// هنا قمنا بتعريف كونستركتور يجب تمرير 4 قيم له عندما يتم إستدعاؤه
	Book(string title, string author, double price, int numberOfPages)
	{
		// هنا قمنا بوضع القيم التي نمررها للكونستركتور بالترتيب في خصائص الكائن
		this->title = title;
		this->author = author;
		this->price = price;
		this->numberOfPages = numberOfPages;
	}

	// تقوم بطباعة كل قيم المتغيرات الموجودة فيه Book عند استدعاءها من أي كائن ننشئه من printInfo هنا قمنا بتعريف دالة إسمها
	void printInfo()
	{
		cout << "Title: " << title << "\n";
		cout << "Author: " << author << "\n";
		cout << "Price: " << price << "$\n";
		cout << "Number of pages: " << numberOfPages << "\n";
	}
};


// main() هنا قمنا بتعريف الدالة
int main()
{
	// مع تمرير القيم التي نريد وضعها فيه بشكل مباشر من خلال الكونستركتور book إسمه Book هنا قمنا بتعريف كائن من
    Book book("C++ for beginners", "Mhamad Harmush", 9.99, 420);

	// حتى تقوم بطباعة القيم الموجودة فيه book من الكائن printInfo() هنا قمنا باستدعاء الدالة
	book.printInfo();

    return 0;
}
		

سنحصل على النتيجة التالية عند التشغيل.

Title: C++ for beginners
Author: Mhamad Harmush
Price: 9.99$
Number of pages: 420
		

الدورات

أدوات مساعدة

أقسام الموقع

دورات
مقالات كتب مشاريع أسئلة