سازنده در ++C — راهنمای کاربردی

۱۵۷۴ بازدید
آخرین به‌روزرسانی: ۱۲ مهر ۱۴۰۲
زمان مطالعه: ۴ دقیقه
سازنده در ++C — راهنمای کاربردی

در این مقاله با مفاهیم مرتبط با سازنده در ++C آشنا خواهید شد. بدین ترتیب با معنی سازنده، شیوه ایجاد آن و انواع سازنده در ++C آشنا می‌شوید. «سازنده» (Constructor) نوع خاصی از تابع عضویت است که در زمان ایجاد یک شیء، آن را به صورت خودکار مقداردهی می‌کند. برای مطالعه بخش قبلی این مجموعه مطلب آموزشی می‌توانید روی لینک زیر کلیک کنید:

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

1... .. ...
2class temporary
3{
4private: 
5	int x;
6	float y;
7public:
8	// Constructor
9	temporary(): x(5), y(5.5)
10	{
11		// Body of constructor
12	}
13	... ..  ...
14};
15
16int main()
17{
18	Temporary t1;
19	... .. ...
20}

برنامه فوق یک سازنده را نشان می‌دهد که بدون نوع بازگشتی تعریف شده و با کلاس همنام است.

طرز کار سازنده (Constructor)

در شبه کد فوق، ()temporary یک سازنده است. زمانی که یک شیء با کلاس temporary ایجاد می‌شود، سازنده به صورت خودکار فراخوانی می‌شود و x با مقدار 5 و y با مقدار 5.5 مقداردهی می‌شود.

همچنین می‌توانید اعضای داده‌ای درون بدنه سازنده را به صورت زیر مقداردهی کنید. با این حال این متد ترجیحی ندارد.

1temporary()
2{
3   x = 5;
4   y = 5.5;
5}
6// This method is not preferred.

استفاده از سازنده در ++C

فرض کنید روی 100 شیء از نوع Person کار می‌کنید و مقدار پیش‌فرض برای عضو داده‌ای age برابر با صفر است. در این حالت، مقداردهی همه اشیا به صورت دستی کاری بسیار دشوار خواهد بود. به جای آن می‌توانید یک سازنده تعریف کنید که مقدار اولیه 0 برای age تعیین کند. سپس تنها کاری که باید انجام دهید، ایجاد یک شیء Person است تا سازنده به صورت خودکار age را مقداردهی کند.

این موقعیت‌ها در زمان مدیریت آرایه‌ی اشیا به طور مکرر پیش می‌آیند. همچنین در صورتی که بخواهید نوعی کد را بی‌درنگ پس از ایجاد یک شیء اجرا کنید، باید از این روش استفاده کنید. بدین ترتیب می‌توانید کد را درون بدنه سازنده قرار دهید.

مثال 1: سازنده در ++C

مساحت یک مستطیل را محاسبه کرده و آن را نمایش دهید:

1#include <iostream>
2using namespace std;
3class Area
4{
5    private:
6       int length;
7       int breadth;
8    public:
9       // Constructor
10       Area(): length(5), breadth(2){ }
11       void GetLength()
12       {
13           cout << "Enter length and breadth respectively: ";
14           cin >> length >> breadth;
15       }
16       int AreaCalculation() {  return (length * breadth);  }
17       void DisplayArea(int temp)
18       {
19           cout << "Area: " << temp;
20       }
21};
22int main()
23{
24    Area A1, A2;
25    int temp;
26    A1.GetLength();
27    temp = A1.AreaCalculation();
28    A1.DisplayArea(temp);
29    cout << endl << "Default Area when value is not taken from user" << endl;
30    temp = A2.AreaCalculation();
31    A2.DisplayArea(temp);
32    return 0;
33}

در برنامه فوق، کلاس Area برای مدیریت کارکردهای مرتبط با مساحت ایجاد شده است. این کلاس دو عضو داده‌ای به نام‌های length و breadth دارد. در کد فوق یک سازنده تعریف شده است که مقدار اولیه length را برابر با 5 و مقدار اولیه breadth را برابر با 2 تعیین می‌کند.

همچنین سه تابع عضو دیگر به نام‌های ()GetLength() ،AreaCalculation و ()DisplayArea داریم که طول را از کاربر می‌گیرند و مساحت را محاسبه کرده و نمایش می‌دهند. سپس تابع عضو ()GetLength اجرا می‌شود که مقدار length و breadth را از کاربر برای شیء A1 می‌گیرد. بدین ترتیب طول و عرض شیء A1 تغییر می‌یابد. در ادامه مساحت برای شیء A1 محاسبه شده و با فراخوانی تابع ()AreaCalculation در متغیر temp ذخیره می‌شود و در نهایت نمایش پیدا می‌کند.

در مورد شیء A2 هیچ داده‌ای از کاربر گرفته نمی‌شوند. بنابراین length و breadth به ترتیب برابر با 5 و 2 باقی می‌مانند. در نهایت مساحت برای A2 محاسبه شده و مقدار 10 نمایش می‌یابد.

خروجی

1Enter length and breadth respectively: 6
27
3Area: 42
4Default Area when value is not taken from user
5Area: 10

Overload کردن سازنده

سازنده را می‌توان به روشی مانند Overload کردن تابع، Overload نمود. سازنده‌های Overload شده نامی یکسان دارند، اما تعداد آرگومان‌هایشان متفاوت است. بسته به تعداد و نوع آرگومان‌های ارسالی، یک سازنده خاص فراخوانی می‌شود. از آنجا که چندین سازنده وجود دارد، آرگومان سازنده نیز باید در زمان ایجاد شیء ارسال شود.

مثال 2: Overload کردن سازنده

1// Source Code to demonstrate the working of overloaded constructors
2#include <iostream>
3using namespace std;
4class Area
5{
6    private:
7       int length;
8       int breadth;
9    public:
10       // Constructor with no arguments
11       Area(): length(5), breadth(2) { }
12       // Constructor with two arguments
13       Area(int l, int b): length(l), breadth(b){ }
14       void GetLength()
15       {
16           cout << "Enter length and breadth respectively: ";
17           cin >> length >> breadth;
18       }
19       int AreaCalculation() {  return length * breadth;  }
20       void DisplayArea(int temp)
21       {
22           cout << "Area: " << temp << endl;
23       }
24};
25int main()
26{
27    Area A1, A2(2, 1);
28    int temp;
29    cout << "Default Area when no argument is passed." << endl;
30    temp = A1.AreaCalculation();
31    A1.DisplayArea(temp);
32    cout << "Area when (2,1) is passed as argument." << endl;
33    temp = A2.AreaCalculation();
34    A2.DisplayArea(temp);
35    return 0;
36}

در مورد شیء A1 هیچ آرگومانی در زمان ایجاد شیء ارسال نمی‌شود. از این رو سازنده بدون هیچ آرگومانی فراخوانی می‌شود که مقدار اولیه length را برابر با 5 و breadth را برابر با 2 تعیین می‌کند. بدین ترتیب مساحت شیء A1 برابر با 10 خواهد بود.

در مورد شیء A2 در زمان ایجاد شیء مقادیر 2 و 1 به عنوان آرگومان ارسال می‌شوند. از این رو سازنده بدون هیچ آرگومانی فراخوانی می‌شود که مقدار اولیه length را برابر با l (در این مورد 2) و مقدار اولیه breadth را برابر با b (در این مورد 1) تعیین می‌کند. بدین ترتیب مساحت شیء A2 برابر با 2 خواهد بود.

خروجی

1Default Area when no argument is passed.
2Area: 10
3Area when (2,1) is passed as argument.
4Area: 2

سازنده کپی پیش‌فرض

یک شیء می‌تواند با شیء دیگری از همان نوع مقداردهی اولیه شود. این کار همان کپی کردن محتوای یک کلاس به کلاس دیگر است. در برنامه فوق اگر بخواهیم یک شیء A3 داشته باشیم که شامل مقادیر یکسانی با A2 باشد، می‌توانیم از روش زیر استفاده کنیم:

1....
2int main()
3{
4   Area A1, A2(2, 1);
5
6   // Copies the content of A2 to A3
7   Area A3(A2);
8     OR, 
9   Area A3 = A2;
10}

ممکن است فکر کنید برای انجام این کار باید یک سازنده جدید ایجاد کنید، اما در واقع نیازی به ساخت سازنده جدید وجود ندارد، چون این سازنده کپی قبلاً در همه کلاس‌ها به صورت پیشفرض ساخته شده است. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *