ساختار (Struct)

ساختارها یا struct انواع داده ای هستند که توسط کاربر تعریف می شوند(user-define) و می توانند دارای فیلد و متد باشند. با ساختارها می توان نوع داده ای خیلی سفارشی ایجاد کرد. فرض کنید می خواهیم داده ای ایجاد کنیم که نه تنها نام شخص را ذخیره کند بلکه سن و حقوق ماهیانه او را نیز در خود جای دهد. برای تعریف یک ساختار به صورت زیر عمل می کنیم :

struct StructName
{
   member1;
   member2;
   member3;
   ...
   member4;
};

برای تعریف ساختار از کلمه کلیدی struct استفاده می شود. برای نامگذاری ساختارها از روش نامگذاری struct استفاده می شود. اعضا در مثال بالا (member1-5) می توانند متغیر باشند یا متد. در زیر مثالی از یک ساختار آمده است :

   1: #include <iostream>
   2: #include <string>
   3: using namespace std;
   4: 
   5: struct Employee                 
   6: {                               
   7:     public:           
   8:         string name;         
   9:         int age;             
  10:         double salary;      
  11: };                    
  12: 
  13: int main()
  14: {
  15:     Employee employee1;
  16:     Employee employee2;
  17: 
  18:     employee1.name = "Jack";  
  19:     employee1.age = 21;       
  20:     employee1.salary = 1000;  
  21: 
  22:     employee2.name = "Mark";  
  23:     employee2.age = 23;       
  24:     employee2.salary = 800;   
  25: 
  26:     cout << "Employee 1 Details" << endl;
  27:     cout << "Name: "   << employee1.name   << endl;
  28:     cout << "Age: "    << employee1.age    << endl;
  29:     cout << "Salary: " << employee1.salary << endl;
  30: 
  31:     cout << endl; //Seperator
  32: 
  33:     cout << "Employee 2 Details" << endl;
  34:     cout << "Name: "   << employee2.name   << endl;
  35:     cout << "Age: "    << employee2.age    << endl;
  36:     cout << "Salary: " << employee2.salary << endl;
  37: }
Employee 1 Details
Name: Jack
Age: 21
Salary: $1000

Employee 2 Datails
Name: Mike
Age: 23
Salary: $800

برای درک بهتر، کد بالا را شرح می دهیم. در خطوط 11-5 یک ساختار تعریف شده است. قبل از نام ساختار از کلمه کلیدی struct استفاده می کنیم. نام ساختار نیز از روش نامگذاری پاسکال پیروی می کند. در داخل بدنه ساختار سه فیلد تعریف کرده ایم. این سه فیلد مشخصات Employee (کارمند) مان را نشان می دهند. مثلا یک کارمند دارای نام، سن و حقوق ماهانه می باشد. همچنین هر سه فیلد به صورت Public تعریف شده اند بنابراین در خارج از ساختار نیز می توان آنها را فراخوانی کرد. در خطوط 15 و 16 دو نمونه از ساختار Employee تعریف شده است. تعریف یک نمونه از ساختارها بسیار شبیه به تعریف یک متغیر معمولی است. ابتدا نوع ساختار و سپس نام آن را مشخص می کنید. در خطوط 18 تا 24 به فیلدهای مربوط به هر Employee مقادیری اختصاص می دهید. برای دسترسی به فیلدها در خارج از ساختار باید آنها را به صورت Public تعریف کنید. ابتدا نام متغیر را تایپ کرده و سپس علامت دات (.) و در آخر نام فیلد را می نویسیم.
وقتی که از عملگر دات استفاده می کنیم این عملگر اجازه دسترسی به اعضای مخصوص آن ساختار یا کلاس را به شما می دهد. در خطوط 26 تا 36 نشان داده شده که شما چطور می توانید به مقادیر ذخیره شده در هر فیلد ساختار دسترسی یابید. در مورد کلاس در درسهای آینده توضیح خواهیم داد. می توان خطوط 15 و 16 کد بالا را به صورت خلاصه زیر هم نوشت :

Employee employee1, employee2;

برای ایجاد شیء از ساختار می توان به صورت زیر هم عمل نمود :

struct Employee          
{                               
    public: 
        string name;         
        int age;             
        double salary;      
}employee1 , employee2;

در نتیجه می توان خطوط 15 و 16 کد بالا را پاک کرد. به جای خطوط 24-18 کد بالا می توان فیلدهای ساختار را به صورت زیر هم مقداردهی کرد :

employee1 = { "Jack", 21, 1000 };

employee2 = { "Mark", 23, 800 };

می توان به ساختار، متد هم اضافه کرد. مثال زیر اصلاح شده مثال قبل است :

   1: #include <iostream>
   2: #include <string>
   3: using namespace std;
   4: 
   5: struct Employee          
   6: {                               
   7:     public: 
   8:         string name;         
   9:         int age;             
  10:         double salary; 
  11: 
  12:         void SayThanks()                             
  13:         {                                           
  14:             cout << name << " thanked you!" << endl;
  15:         }                                           
  16: };
  17: 
  18: int main()
  19: {
  20:     Employee employee1;
  21:     Employee employee2;
  22: 
  23:     employee1.name = "Jack";  
  24:     employee1.age = 21;       
  25:     employee1.salary = 1000;  
  26: 
  27:     employee2.name = "Mark";  
  28:     employee2.age = 23;       
  29:     employee2.salary = 800;   
  30: 
  31:     cout << "Employee 1 Details" << endl;
  32:     cout << "Name: "     << employee1.name   << endl;
  33:     cout << "Age: "      << employee1.age    << endl;
  34:     cout << "Salary: $"  << employee1.salary << endl;
  35:     employee1.SayThanks();
  36: 
  37:     cout << endl; //Seperator
  38: 
  39:     cout << "Employee 2 Details" << endl;
  40:     cout << "Name: "    << employee2.name    << endl;
  41:     cout << "Age: "     << employee2.age     << endl;
  42:     cout << "Salary: $" << employee2.salary  << endl;
  43:     employee2.SayThanks();
  44: }
Employee 1 Details
Name: Jack
Age: 21
Salary: $1000
Jack thanked you!

Employee 2 Details
Name: Mark
Age: 23
Salary: $800
Mark thanked you!

در خطوط 12 تا 15 یک متد در داخل ساختار تعریف شده است. این متد یک پیام را در صفحه نمایش نشان می دهد و مقدار فیلد name را گرفته و یک پیام منحصر به فرد برای هر نمونه نشان می دهد. برای فراخوانی متد، به جای اینکه بعد از علامت دات نام فیلد را بنویسیم، نام متد را نوشته و بعد از آن همانطور که در مثال بالا مشاهده می کنید (خطوط 35 و 43) پرانتزها را قرار می دهیم و در صورتی که متد به آرگومان هم نیاز داشت در داخل پرانتز آنها را می نویسیم.