بیشتر اوقات، با موقعیتهایی روبرو میشویم که باید گروهی از دادهها را که یا انواع دادهی مشابهی دارند یا انواع دادهی غیرمشابه، ذخیره کنیم. میدانیم که آرایهها برای ذخیرهی مجموعهای داده، از انواع دادهی مشابه در مکانهای حافظه به صورت پیوسته استفاده میشوند. برخلاف آرایه، ساختار در C++ انواع داده تعریف شده کاربر است که برای ذخیرهی گروهی از آیتمها از انواع دادهی غیرمشابه، استفاده میشود.
یک ساختار یک نوع دادهی تعریفشده کاربر در ++C/C است. یک ساختار یک نوع داده ایجاد میکند که میتواند برای گروهی از آیتمها از انواع دادهی ممکن در یک نوع واحد استفاده شود.
کلمهی کلیدی struct برای ایجاد یک ساختار در C++ استفاده میشود. نحو (syntax) کلی برای ایجاد یک ساختار به این صورت است:
struct structureName{ member1; member2; member3; . . . memberN; };
ساختارها در ++C میتوانند شامل دو نوع عضو باشند:
اعضای داده (Data Member): این اعضا متغیرهای معمولی در ++C هستند. میتوان یک ساختار با متغیرهایی از انواع دادهی مختلف در ++C ایجاد کرد.
توابع عضو (Member Functions): این اعضا توابع معمولی در ++C هستند. در کنار متغیرها، میتوان توابع را نیز در درون یک ساختار اضافه کرد.
// Data Members int roll; int age; int marks; // Member Functions void printDetails() { cout<<"Roll = "<<roll<<"\n"; cout<<"Age = "<<age<<"\n"; cout<<"Marks = "<<marks; }
در ساختار بالا، اعضای داده، سه متغیر integer برای ذخیره تعداد roll و age و marks از هر دانشآموزش هستند و تابع عضو ()printDetails است که همهی جزئيات بالا از هر دانشآموز را چاپ میکند.
یک متغیر ساختار میتواند هم با اعلام ساختار اعلام شود یا به عنوان یک اعلام جدا مانند انواع پایه اعلام شود:
// A variable declaration with structure declaration. struct Point { int x, y; } p1; // The variable p1 is declared with 'Point' // A variable declaration like basic data types struct Point { int x, y; }; int main() { struct Point p1; // The variable p1 is declared like a normal variable }
نکته: در ++C، کلمهی کلیدی struct قبل از اعلام یک متغیر، اختیاری (optional) است. اما در زبان C، اجباری است.
اعضای ساختار در C++ نمیتوانند با اعلام شدن، مقداردهی اولیه شوند. برای مثال، قطعهکُد زیر در زبان C با خطای کامپایلر روبرو میشود. اما در 11++C به درستی اجرا میشود:
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };
دلیل خطای بالا ساده است، زمانی که یک نوع داده اعلام (declared) میشود، هیج حافظهای به آن اختصاص داده نمیشود. حافظه تنها زمانی که متغیرها ایجاد شده باشند، اختصاص داده میشود.
اعضای ساختار در ++C میتوانند با اعلام شدن (declaration) مقداردهی اولیه شوند. برای مثال، قطعهکُد زیر در زبان ++C بدون هیچگونه خطایی اجرا میشود:
// In C++ We can Initialize the Variables with Declaration in Structure. #include <iostream> using namespace std; struct Point { int x = 0; // It is Considered as Default Arguments and no Error is Raised int y = 1; }; int main() { struct Point p1; // Accessing members of point p1 // No value is Initialized then the default value is considered. ie x=0 and y=1; cout << "x = " << p1.x << ", y = " << p1.y<<endl; // Initializing the value of y = 20; p1.y = 20; cout << "x = " << p1.x << ", y = " << p1.y; return 0; } // This code is contributed by Samyak Jain
خروجی قطعهکُد بالا به این صورت است:
x=0, y=1 x=0, y=20
اعضای ساختار میتوانند با استفاد از کروشه {} مقداردهی اولیه شوند. برای مثال، مقداردهی اولیه به صورت زیر، معتبر است:
struct Point { int x, y; }; int main() { // A valid initialization. member x gets value 0 and y // gets value 1. The order of declaration is followed. struct Point p1 = { 0, 1 }; }
اعضای ساختار با استفاده از اُپریتور نقطه یا دات ( . ) قابل دسترس هستند:
#include <iostream> using namespace std; struct Point { int x, y; }; int main() { struct Point p1 = { 0, 1 }; // Accessing members of point p1 p1.x = 20; cout << "x = " << p1.x << ", y = " << p1.y; return 0; }
خروجی قطعهکُد بالا به این صورت است:
x = 20, y = 1
همانند دیگر انواع اصلی، میتوان یک آرایه از ساختار ایجاد کرد، به این صورت:
#include <iostream> using namespace std; struct Point { int x, y; }; int main() { // Create an array of structures struct Point arr[10]; // Access array members arr[0].x = 10; arr[0].y = 20; cout << arr[0].x << " " << arr[0].y; return 0; }
خروجی قطعهکُد بالا به این صورت است:
10 20
همانند انواع اصلی، میتوان اشارهگری به یک ساختار داشت. اگر یک اشارهگر به ساختار داشته باشیم، اعضا با استفاده از اُپریتور پیکان ( <- ) به جای اُپریتور دات ( . ) یا همان نقطه قابل دسترس هستند:
#include <iostream> using namespace std; struct Point { int x, y; }; int main() { struct Point p1 = { 1, 2 }; // p2 is a pointer to structure p1 struct Point* p2 = &p1; // Accessing structure members using // structure pointer cout << p2->x << " " << p2->y; return 0; }
خروجی قطعهکُد بالا به این صورت است:
1 2
در اینجا https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/ میتوانید، این موضوع را بررسی کنید.
در ++C، یک ساختار شبیه به یک کلاس است به جز تفاوتهای جزئی. مهمترین آنها امنیت است. یک ساختار امن نیست و نمیتواند جزئیات پیادهسازیاش را از کاربر نهایی (end user) مخفی کند. در حالی که یک کلاس امن است و میتواند جزئیات طراحی و برنامهنویسیاش را مخفی کند.
منبع: وب سایت geeksforgeeks
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.