ساختار (Struct) در ++C

Structs in C Plus Plus

structs-in-c-plus-plus

بیشتر اوقات، با موقعیت‌هایی روبرو می‌شویم که باید گروهی از داده‌ها را که یا انواع داده‌ی مشابهی دارند یا انواع داده‌ی غیر‌مشابه، ذخیره کنیم. می‌دانیم که آرایه‌ها برای ذخیره‌ی مجموعه‌ای داده، از انواع داده‌ی مشابه در مکان‌های حافظه‌ به صورت پیوسته استفاده می‌شوند. برخلاف آرایه‌، ساختار در C++ انواع داده‌ تعریف شده کاربر است که برای ذخیره‌ی گروهی از آیتم‌ها از انواع داده‌ی غیرمشابه، استفاده می‌شود.

ساختار در C++ چیست؟

یک ساختار یک نوع داده‌ی تعریف‌شده کاربر در ++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 است که همه‌ی جزئيات بالا از هر دانش‌آموز را چاپ می‌کند.

نحوه‌ی اعلام متغیر‌های یک ساختار در C++ به چه شکل است؟

یک متغیر ساختار می‌تواند هم با اعلام ساختار اعلام شود یا به عنوان یک اعلام جدا مانند انواع پایه اعلام شود:

// 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

تراز‌بندی اعضای ساختار (structure member alignment) چیست؟

در اینجا https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/ می‌توانید، این موضوع را بررسی کنید.

در ++C، یک ساختار شبیه به یک کلاس است به جز تفاوت‌های جزئی. مهم‌ترین آن‌ها امنیت است. یک ساختار امن نیست و نمی‌تواند جزئیات پیاده‌سازی‌اش را از کاربر نهایی (end user) مخفی کند. در حالی که یک کلاس امن است و می‌تواند جزئیات طراحی و برنامه‌نویسی‌اش را مخفی کند.


منبع: وب سایت geeksforgeeks

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.