منبع اصلی نوشتار زیر در این لینک قرار دارد

آموزش تابع سازنده و مخرب در سی پلاس پلاس

کلاس ها در سی پلاس پلاس یک تابع عضو ویژه به نام سازنده یا همان Constructor می توانند داشته باشند که یک شئ را قادر می سازد تا در زمان ایجاد آن، تابع سازنده خود را فرخوانی کند. از این تابع معمولاً برای مقداردهی اولیه خودکار در اشیا استفاده می شود. همچنین مفهوم شئ گرایی در سی پلاس پلاس یک تابع عضو دیگر به نام تابع مخرب یا Destructor را فراهم می کند که برای از بین بردن اشیا هنگامی که دیگر مورد نیاز نیستند، استفاده می شود.

در این مطلب آموزشی از اوپن مایند، وبسایت آموزش الگوریتم ها و برنامه نویسی، با نحوه کار سازنده ها و مخرب ها، انواع سازنده ها و نحوه اجرای آنها در یک برنامه سی پلاس پلاس آشنا می شوید.

تابع سازنده چیست؟

به عنوان یک زبان برنامه نویسی شئ گرا، روند ایجاد و حذف اشیاء در سی پلاس پلاس یک کار مهم و پراستفاده است. هر بار که نمونه ای (یک شئ جدید) از کلاس ایجاد می شود، بلافاصله تابع سازنده آن صدا زده می شود.

سازندگان یک عضو خاص کلاس است و از آن برای مقداردهی اشیا کلاس استفاده می شود که به عنوان یک تابع عضو ویژه، انتخاب نام برای آن هم محدودیت خاصی دارد؛ نام سازنده باید نام کلاس برابر باشد. دلیل اینکه نام این توابع “سازنده” است آن است که، فراخوانی آن ها در ادامه روند ساخت شئ در حافظه، انجام می شود.

باید بدانید که مقادیر اولیه هنگام اعلام (declare) شی جدید می توانند به عنوان آرگومان برای سازنده ارسال شوند.

نکته: فراخوانی تابع سازنده به دو فرم مختلف ممکن است

اول، فراخوانی به طور مستقیم (نوشتن نام آن در کدنویسی کلاس)

دوم، فراخوانی به طور ضمنی و خودکار (هنگام ایجاد شئ)

 

کد زیر مثالی از نوشتار اعلان و تعریف بدنه تابع سازنده برای یک کلاس در سی پلاس پلاس است.

class class_name
{
 int g, h;
 public:
 class_name(void);  // Constructor Declared
 . . .
 };
class_name :: class_name()
{
 g=1; h=2;  // Constructor defined
}

 

ویژگی های خاص توابع سازنده در سی پلاس پلاس

  • تابع سازنده باید به صورت public تعریف شود (بخش public در کلاس).
  • تابع سازنده مقداری را بر نمی گرداند و در تعریف آن نوع خروجی مشخص نمی شود (حتی void).
  • حتماً در زمان ساخت شئ جدید، به طور خودکار صدا زده می شوند.
  • تابع سازنده به ارث برده نمی شود (کلاس مشتق شده، تنها می تواند تابع سازنده والد خود را صدا بزند).
  • مانند هر تابع عضو دیگری در کلاس، می تواند آرگومان ورودی داشته باشد.
  • نمی توان به آدرس آن ها در حافظه ارجاعی داد.
  • توابع سازنده نمی توانند به صورت مجازی یا virtual تعریف شوند.

 

انواع پیاده سازی توابع سازنده

در سی پلاس پلاس چهار نوع کلی تابع سازنده می توانیم داشته باشیم.

  1. تابع سازنده هیچ کاره! (Do nothing constructor)
  2. تابع سازنده پیشفرض (Default constructor)
  3. تابع سازنده پارامتری (Parameterized constructor)
  4. تابع سازنده کپی (Copy constructor)

در ادامه مفهوم این چهار نوع تابع سازنده شرح داده است.

تابع سازنده هیچ کاره یا Do nothing constructor

تابع سازنده هیچ کاره، هیچ دستوری داخل خود ندارد؛ و هیچ آرگومانی ندارد و مقداری را هم بر نمی گرداند. بنابراین مطابق معنای واقعی اسم خود، هیچ کاری نمی کند!

 

تابع سازنده پیشفرض یا default constructor

تابع سازنده پیشفرض سازنده ای است که هیچ آرگومانی نمی گیرد اما داخل خود دستوراتی برای مقداردهی اولیه به برخی متغیرها یا تنظیم اولیه وضعیت شئ دارد.

طبق تعریف بالا، یک نمونه از این نوع سازنده در کد زیر پیاده سازی شده است.

class_name()
{
 // Constructor Definition ;
}

//Code Snippet:
#include <iostream>
using namespace std;

class Calc {
 int val;

public:
 Calc()
 {
 val = 20;
 }
};
int main()
{
 Calc c1;
 cout << c1.val;
}

 

تابع سازنده پیشفرض آنچنان مهم است که اگر کلاس تعریف شده سازنده ای نداشته باشد، خود کامپایلر هنگام ساخت معادل باینری، یک تابع سازنده از این نوع برای آن می سازد.

 

تابع سازنده پارامتری یا Parameterized constructor

همانطور که در بالاتر گفته شد، تابع سازنده پیشفرض هیچ آرگومانی نمی گیرد. اما برنامه نویسان می توانند تعدادی آرگومان را برای استفاده در سازنده شئ درنظر بگیرند و به کمک آن ها مقداردهی اولیه انجام دهند. به این نوع سازنده که آرگومان هایی برای مقداردهی اولیه برخی یا تمام متغیرهای عضو می گیرد، تابع سازنده Parameterized می گویند.

#include <iostream>
using namespace std; 

 class Calc
 {
  int val2;
  public:
  Calc(int x)
  {
   val2=x;
 }
};
 
 int main()
 {
  Calc c1(10);
  Calc c2(20);
  Calc c3(30);
  cout << c1.val2;
  cout << c2.val2;
  cout << c3.val2;
}

 

تابع سازنده کپی یا Copy constructor

این نوع تابع سازنده زیرمجموعه ای از تابع سازنده با آرگومان (همان Parameterized constructor) است، تنها تفاوت آن این است که به عنوان آرگومان یک شئ را می گیرد و از آن برای کپی مقادیر متغیرهای عضو شئ گرفته شده استفاده می کند. در واقع این نوع سازنده برای ساخت یک نمونه (شئ) مشابه از روی شئ وارد شده استفاده می شود.

نحوه ایجاد شئ کپی با این روش به صورت زیر است:

Calc C2(C1);
Or
Calc C2 = C1;

 

یک مثال کامل از این نوع تابع سازنده در زیر پیاده سازی شده است:

#include <iostream>
using namespace std;

class CopyCon {
 int a, b;

public:
 CopyCon(int x, int y)
 {
 a = x;
 b = y;
 cout << "\nHere is the initialization of Constructor";
 }
 void Display()
 {
 cout << "\nValues : \t" << a << "\t" << b;
 }
};

void main()
{
 CopyCon Object(30, 40);
 //Copy Constructor
 CopyCon Object2 = Object;
 Object.Display();
 Object2.Display();
}

 

توابع مخرب یا Destructors در سی پلاس پلاس چه هستند؟

همانطور که از نام آن پیداست ، توابع تخریب کننده یا مخرب یا Destructor هنگام از بین رفتن شئ اجرا می شوند. در واقع زمانی که کنترل اجرای برنامه به خارج از حوزه تعریف یک شئ می رسد (به دلیل انتقال و پیشروی کنترل یا خارج شدن از تمام برنامه)، تابع مخرب آن اجرا می شود و در نهایت شئ از حافظه پاک می شود.

نام توابع مخرب، همانند نام کلاس است ، اما از آنها قبل از یک علامت مَد یا tilde (~) استفاده می شود. توضیه می شود که در پایان پیاده سازی بدنه کلاس، تابع مخرب را هم اعلان و تعریف کنید.

در کد زیر نحوه نوشتار اعلان تابع مخرب آورده شده است.

class A
{
    public:
    // defining destructor for class
    ~A() 
    {
        // statement
    }   
};

دقت کنید که توابع مخرب هیچگاه آرگومانی ندارند.

 

و اما دو مثال مفید:

مثال: ترتیب و نحوه اجرای توابع سازنده و مخرب

class A
{
    // constructor
    A()
    {
        cout << "Constructor called";
    }

    // destructor
    ~A()
    {
        cout << "Destructor called";
    }
};

int main()
{
    A obj1;   // Constructor Called
    int x = 1
    if(x)
    {
        A obj2;  // Constructor Called
    }   // Destructor Called for obj2
} //  Destru

خروجی اجرای کد این مثال به شکل زیر است:

Constructor called
Constructor called
Destructor called
Destructor called

وقتی یک شی ساخته می شود، سازنده کلاس شئ برای آن اجرا می شود. زمان حیات شئ با پایان یافتن حوزه تعریف آن از تمام می شود؛ که عموماً بعد از بسته شدن آکولاد یا تمام شدن تابع است ( آکولاد برای بلوکی از کد که شئ در آن ایجاد شده است).

در مثال بالا شئ

obj2
وقتی بلوک if تمام می شود از بین می رود زیرا در داخل بلوک if ایجاد شده است. و با پایان یافتن تابع
main
شئ
obj1
هم از بین می رود.

 

مثال: ترکیب توابع سازنده Default و Parameterized به کمک مقدار پیشفرض آرگومان

در این مثال از آرگومان پیش فرض استفاده خواهیم کرد تا یک تعریف واحد برای سازنده های پیشفرض و پارامتری (آرگومانی) داشته باشد.

class Dual
{
    public:
    int a;
    Dual(int x=0)
    {
        a = x;
    }
};

int main()
{
    Dual obj1;
    Dual obj2(10);
}

 

امیدواریم که این مطلب آموزشی برای شما مفید بوده باشد.

اگر سوالی برای شما پیش آمده است، در بخش نظرات همین مطلب، حتماً بنویسید و بپرسید.



برچسب ها : , , ,