C++ الهيكل مع المثال

⚡ ملخص ذكي

الهيكل في C++ هو نوع بيانات معرف من قبل المستخدم يقوم بتجميع عناصر من أنواع بيانات مختلفة تحت اسم واحد، مما يسمح لمتغير واحد بحمل قيم ذات صلة مثل اسم الشخص وجنسيته وعمره معًا.

  • 📦 أنواع البيانات المختلفة: يقوم الهيكل بتجميع المتغيرات ذات الأنواع المختلفة تحت اسم واحد يحدده المستخدم.
  • 🔑 الكلمة المفتاحية struct: قم بتعريف بنية باستخدام الكلمة المفتاحية struct، ثم قم بإدراج الأعضاء داخل الأقواس المعقوفة.
  • 🧱 إنشاء مثيلات: يقوم برنامج كتابة الشخص p بإنشاء متغير هيكلي وتخصيص ذاكرته.
  • 🎯 عامل النقطة: اقرأ أو قم بتعيين أي عضو من خلال المثيل، كما في p.age = 27.
  • ➡️ المؤشرات والوظائف: تتعامل البنية مع المؤشرات وتمررها إلى الدالة مثل وسيط عادي.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم برنامج GitHub Copilot وغيره من مساعدي الذكاء الاصطناعي بإنشاء تعريفات الهياكل والوصول إلى الأعضاء من خلال التعليقات.

C++ الهيكل

ما هو الهيكل في C++?

الهيكل هو C++ بنية البيانات التي يمكن استخدامها لتخزين عناصر من أنواع بيانات مختلفة معًا. في C++البنية هي نوع بيانات يُعرّفه المستخدم. تُنشئ البنية نوع بيانات للمجموعاتping عناصر من أنواع بيانات مختلفة ضمن نوع بيانات واحد.

فمثلا:

لنفترض أنك بحاجة إلى تخزين معلومات عن شخص ما واسمه وجنسيته وعمره. يمكنك إنشاء متغيرات مثل الاسم والجنسية والعمر لتخزين البيانات بشكل منفصل.

مع ذلك، قد تحتاج في المستقبل إلى تخزين معلومات عن العديد من الأشخاص. هذا يعني إنشاء متغيرات لأفراد مختلفين، مثل: الاسم، الجنسية، العمر، إلخ. لتجنب ذلك، يُفضّل إنشاء بنية بيانات (struct).

متى تستخدم الهيكل؟

فيما يلي بعض الأسباب لاستخدام البنية في C++.

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

C++ تهيئة الهيكل

لخلق C++ البنية، نستخدم الكلمة الأساسية للبنية، متبوعة بمعرف. يصبح المعرف اسم البنية. هنا هو بناء الجملة لإنشاء C++ الهيكل:

بناء الجملة:

struct struct_name  
{  
     // struct members
}   

في بناء الجملة أعلاه، استخدمنا الكلمة الأساسية struct. struct_name هو اسم البنية.

تتم إضافة أعضاء البنية داخل الأقواس المتعرجة. ربما ينتمي هؤلاء الأعضاء إلى أنواع بيانات مختلفة.

فمثلا:

struct Person  
{  
    char name[30];  
     int citizenship;  
     int age;  
}  

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

إنشاء مثيلات البنية

في المثال أعلاه، قمنا بإنشاء بنية تسمى الشخص. يمكننا إنشاء متغير البنية على النحو التالي:

Person p;

p هو متغير هيكلي من النوع Person. يمكننا استخدام هذا المتغير للوصول إلى أعضاء البنية.

الوصول إلى أعضاء الهيكل

للوصول إلى أعضاء الهيكل، نستخدم مثيل الهيكل وعامل النقطة (.). على سبيل المثال، للوصول إلى عمر العضو في الهيكل Person:

p.age = 27;

لقد وصلنا إلى عمر العضو الخاص بشخص البنية باستخدام مثيل البنية، ص. لقد قمنا بعد ذلك بتعيين قيمة عمر العضو على 27 عامًا.

مثال 1:

#include <iostream>    
using namespace std;
struct Person
{
	int citizenship;
	int age;
};
int main(void) {
	struct Person p;
	p.citizenship = 1;
	p.age = 27;
	cout << "Person citizenship: " << p.citizenship << endl;
	cout << "Person age: " << p.age << endl;

	return 0;
}

الإخراج:

الوصول إلى أعضاء الهيكل

فيما يلي لقطة شاشة للكود:

الوصول إلى أعضاء الهيكل

Code التفسير:

  1. قم بتضمين ملف رأس iostream في برنامجنا لاستخدام الوظائف المحددة فيه.
  2. قم بتضمين مساحة الاسم std لاستخدام فئاتها دون استدعائها.
  3. إنشاء بنية باسم الشخص.
  4. بداية الجسم الهيكلي.
  5. قم بإنشاء عضو هيكلي يسمى الجنسية من النوع الصحيح.
  6. قم بإنشاء عضو هيكلي يسمى العمر من النوع عدد صحيح.
  7. نهاية الجسم الهيكلي.
  8. استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
  9. قم بإنشاء مثيل للبنية الشخص وإعطائه الاسم p.
  10. اضبط قيمة جنسية عضو الهيكل على 1.
  11. اضبط قيمة عمر عضو البنية على 27.
  12. اطبع قيمة جنسية عضو البنية على وحدة التحكم إلى جانب بعض النصوص الأخرى.
  13. اطبع قيمة عمر عضو البنية على وحدة التحكم إلى جانب بعض النصوص الأخرى.
  14. يجب أن يقوم البرنامج بإرجاع قيمة إذا تم تشغيله بنجاح.
  15. نهاية الوظيفة الرئيسية ().

مؤشرات إلى الهيكل

من الممكن إنشاء مؤشر يشير إلى بنية. الأمر مشابه لكيفية إنشاء المؤشرات التي تشير إلى أنواع البيانات الأصلية مثل int وfloat وdouble وما إلى ذلك. لاحظ أن المؤشر في C++ سيتم تخزين موقع الذاكرة.

مثال 2:

#include <iostream>
using namespace std;

struct Length
{
	int meters;
	float centimeters;
};

int main()
{
	Length *ptr, l;

	ptr = &l;

	cout << "Enter meters: ";
	cin >> (*ptr).meters;
	cout << "Enter centimeters: ";
	cin >> (*ptr).centimeters;
	cout << "Length = " << (*ptr).meters << " meters " << (*ptr).centimeters << " centimeters";

	return 0;
}

الإخراج:

مؤشرات إلى الهيكل

فيما يلي لقطة شاشة للكود:

مؤشرات إلى الهيكل

Code التفسير:

  1. قم بتضمين ملف رأس iostream في برنامجنا لاستخدام وظائفه.
  2. قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاتها دون استدعائها.
  3. قم بإنشاء بنية تسمى الطول.
  4. بداية جسم الهيكل الطول.
  5. قم بإنشاء عضو هيكلي يسمى متر من نوع البيانات الصحيح.
  6. قم بإنشاء عضو هيكلي يسمى السنتيمترات من النوع عدد صحيح.
  7. نهاية جسم الهيكل الطول.
  8. استدعاء الدالة الرئيسية ().
  9. بداية نص الدالة main().
  10. قم بإنشاء متغير المؤشر *ptr والمتغير العادي l من النوع Length.
  11. قم بتخزين عنوان المتغير l في ملفنا متغير المؤشر.
  12. قم بعرض رسالة على وحدة التحكم تطلب من المستخدم إدخال قيمة العدادات المتغيرة.
  13. قراءة القيمة التي أدخلها المستخدم عبر لوحة المفاتيح. يتم هنا الوصول إلى عدادات وظائف الأعضاء باستخدام متغير المؤشر.
  14. قم بعرض رسالة على وحدة التحكم تطلب من المستخدم إدخال قيمة السنتيمترات المتغيرة.
  15. قراءة القيمة التي أدخلها المستخدم عبر لوحة المفاتيح. يتم هنا الوصول إلى سنتيمترات وظيفة العضو باستخدام متغير المؤشر.
  16. اعرض القيم المقروءة من المستخدم على وحدة التحكم بجانب بعض النصوص الأخرى.
  17. يجب أن يقوم البرنامج بإرجاع قيمة عند التنفيذ الناجح.
  18. نهاية نص الدالة main().

الهيكل كوسيطة دالة

يمكنك تمرير البنية إلى دالة كوسيطة. يتم ذلك بنفس طريقة تمرير وسيطة عادية. يمكن أيضًا تمرير متغيرات البنية إلى دالة. وخير مثال على ذلك هو عندما تحتاج إلى عرض قيم أعضاء البنية. دعونا نوضح هذا:

مثال 3:

#include<iostream>
using namespace std;

struct Person
{
	int citizenship;
	int age;
};

void func(struct Person p);

int main()
{
	struct Person p;

	p.citizenship = 1;
	p.age = 27;

	func(p);
	return 0;
}
void func(struct Person p)
{
	cout << " Person citizenship: " << p.citizenship<<endl;
	cout << " Person age: " << p.age;
}

الإخراج:

الهيكل كوسيطة دالة

فيما يلي لقطة شاشة للكود:

الهيكل كوسيطة دالة

Code التفسير:

  1. قم بتضمين ملف رأس iostream في ملفنا. سنستخدم بعد ذلك وظائفه دون الحصول على أخطاء.
  2. قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاته. لن نحتاج إلى استدعاء مساحة الاسم لاستخدام فئاتها.
  3. إنشاء بنية باسم الشخص.
  4. بداية جسم الشخص الهيكلي.
  5. إنشاء عضو في هيكل الشخص. يُسمى العضو بالجنسية وهو من النوع الصحيح.
  6. إنشاء عضو في هيكل الشخص. يُسمى العضو بالعمر وهو من النوع عدد صحيح.
  7. نهاية جسد الشخص الهيكلي.
  8. قم بإنشاء دالة تأخذ مثيل struct Person، p، كوسيطة.
  9. استدعاء الوظيفة الرئيسية. يمثل { بداية نص الوظيفة الرئيسية ().
  10. قم بإنشاء مثيل لـ struct Person وإعطائه الاسم p.
  11. قم بالوصول إلى المواطنة المتغيرة لعضو البنية باستخدام مثيل البنية، p، وتعيين القيمة 1 لها.
  12. قم بالوصول إلى متغير عمر عضو البنية باستخدام مثيل البنية p، وتعيين القيمة 27 له.
  13. استدعاء الدالة وتمرير مثيل البنية الشخص، p، إليها كوسيطة.
  14. يجب أن تقوم الدالة بإرجاع قيمة عند التنفيذ الناجح.
  15. نهاية نص الدالة main().
  16. إنشاء نص الوظيفة.
  17. بداية جسم الوظيفة.
  18. قم بالوصول إلى قيمة جنسية عضو البنية وطباعتها على وحدة التحكم بجانب النص الآخر.
  19. قم بالوصول إلى قيمة عمر عضو البنية وطباعتها على وحدة التحكم بجانب النص الآخر.
  20. نهاية الجسم الوظيفي.

الحد من أ C++ بناء

وفيما يلي حدود الهياكل:

  • لا يمكن التعامل مع نوع بيانات البنية مثل أنواع البيانات المضمنة.
  • Operaتورس مثل + -، ولا يمكن استخدام الآخرين المتغيرات الهيكلية.
  • الهياكل لا تدعم إخفاء البيانات. يمكن الوصول إلى أعضاء البنية بواسطة أي وظيفة بغض النظر عن نطاقها.
  • لا يمكن الإعلان عن الأعضاء الثابتين داخل نص الهيكل.
  • لا يمكن إنشاء المنشئين داخل الهيكل.

الأسئلة الشائعة

In C++ البنية والفئة متطابقتان تقريبًا. الفرق الوحيد الحقيقي هو الوصول الافتراضي: عناصر البنية عامة افتراضيًا، بينما عناصر الفئة خاصة. يدعم كلاهما الدوال الأعضاء، والمنشئات، والوراثة.

لا يحتوي هيكل AC إلا على البيانات، ويجب كتابة struct قبل كل تعريف لمتغير. C++ يمكن أن تتضمن البنية أيضًا وظائف الأعضاء، والمنشئات، ومحددات الوصول، وتكون الكلمة المفتاحية struct اختيارية عند تعريف المتغيرات.

قم بتعريف البنية، ثم حدد مصفوفة منها، على سبيل المثال Person people[3]. كل عنصر هو بنية كاملة، ويمكنك الوصول إلى العناصر باستخدام people[0].age. تخزن مصفوفات البنى العديد من السجلات من نفس النوع معًا.

البنية المتداخلة هي بنية مُعرَّفة كعضو داخل بنية أخرى. وهي تجمع البيانات الفرعية ذات الصلة، مثل بنية التاريخ الموضوعة داخل بنية الموظف. يمكنك الوصول إلى الأعضاء الداخلية عن طريق ربط عامل النقطة.

حجم الدالة يُقارب مجموع أعضائها، بالإضافة إلى مساحة إضافية يُضيفها المُصرّف للمحاذاة، لذا قد يتجاوز حجم الدالة الإجمالي. لا تُضيف الدوال الأعضاء أي مساحة إضافية. ترتيب الأعضاء حسب الحجم يُقلل من المساحة الإضافية غير المُستخدمة.

استخدم عامل السهم عند الاحتفاظ بمؤشر إلى بنية. بدلاً من (*ptr).age، يقرأ الاختصار ptr->age نفس العنصر. يعمل عامل النقطة على نسخة مباشرة، وليس على مؤشر.

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

نعم. مساعد الطيار جيثب يقترح تعريفات البنية، ومتغيرات الأعضاء، وإمكانية الوصول باستخدام النقطة أو السهم أثناء الكتابة في محرر النصوص. يتعامل مع التعليمات البرمجية المتكررة بكفاءة، مع ذلك، يُنصح بالتحقق من أنواع البيانات، والحشو، والمنطق قبل التجميع.

تلخيص هذه التدوينة بـ: