در این آموزش، در مورد سازنده ها در C++ یاد خواهید گرفت; سازنده چیست، چطور تعریف می شود و انواع آن.
سازنده نوع خاصی از توابع کلاس است که وقتی ایجاد می شود، یک شی را به صورت خودکار راه اندازی می کند.
کامپایلر سازنده را با نام و نوع بازگشتی آن می شناسد.
سازنده نام مشابه کلاس دارد و هیچ نوع بازگشتی ندارد و همواره از نوع public است.
… .. …
class temporary
{
private:
int x;
float y;
public:
// Constructor
temporary(): x(5), y(5.5)
{
// Body of constructor
}
… .. …
};
int main()
{
Temporary t1;
… .. …
}
برنامه بالا نشان می دهد که سازنده بدون نوع بازگشتی و هم نام کلاس تعریف شده است.
سازنده چگونه کار می کند؟
در شبه کد بالا، ()temporary سازنده است.
هنگامی که یک شی از کلاس ایجاد می شود، سازنده به طور خودکار صدا زده شده، به x مقدار ۵ و به y مقدار ۵٫۵ می دهد.
همچنین می توانید متغیر ها را داخل بدنه سازنده به شکل زیر مقدار دهی کنید. با این حال، این روش ترجیح داده نمی شود.
temporary()
{
x = 5;
y = 5.5;
}
// This method is not preferred.
استفاده از سازنده در C++
فرض کنید روی ۱۰۰ شی Person کار می کنید و مقدار پیش فرض متغیر age برابر با ۰ است. تمام اشیا را یکی یکی مقدار دهی کردن بسیار خسته کننده است.
در عوض، می توانید یک سازنده تعریف کنید که مقدار سن را برابر ۰ قرار می دهد. پس کاری که باید انجام دهید این است که شی Person ایجاد کنید و سپس سازنده به طور خودکار سن را مقدار دهی می کند.
این موقعیت ها اغلب هنگام سر و کار داشتن با آرایه ای از اشیاء بوجود می آیند.
همچنین، اگر بخواهیم قسمتی از کد، بلافاصله پس از ایجاد شیء اجرا شود، می توان کد را درون سازنده قرار داد.
مثال ۱ : سازنده در C++
محاسبه ی محیط مستطیل و نمایش آن.
void GetLength()
{
cout << “Enter length and breadth respectively: “;
cin >> length >> breadth;
}
int AreaCalculation() { return (length * breadth); }
void DisplayArea(int temp)
{
cout << “Area: ” << temp;
}
};
int main()
{
Area A1, A2;
int temp;
A1.GetLength();
temp = A1.AreaCalculation();
A1.DisplayArea(temp);
cout << endl << “Default Area when value is not taken from user” << endl;
temp = A2.AreaCalculation();
A2.DisplayArea(temp);
return 0;
}
در برنامه بالا، کلاس Area برای مدیریت ویژگی های مرتبط با محیط ایجاد شده که دو عضو طول و عرض دارد.
یک سازنده تعریف شده که طول را برابر ۵ و عرض را برابر ۲ قرار می دهد.
همچنین دارای سه تابع
GetLength()
AreaCalculation()
DisplayArea()
برای دریافت طول از کاربر، محاسبه محیط و نمایش محیط است.
وقتی که اشیاء A1 و A2 ایجاد می شوند، سازنده طول و عرض هر دو را برابر ۵ و ۲ قرار می دهد.
سپس، تابع GetLength() فراخوانی می شود که مقدار طول و عرض شی A1 را از کاربر می گیرد و طول و عرض شی A1 را تغییر می دهد.
سپس، محیط شی A1 با فراخوانی تابع ()AreaCalculation محاسبه و در متغیر temp ذخیره می شود و در نهایت، نمایش داده می شود.
برای شی A2، هیچ اطلاعاتی از کاربر خواسته نمی شود. بنابراین طول و عرض به ترتیب ۵ و ۲ است.
سپس، محیط A2 محاسبه و نمایش داده می شود که برابر ۱۰ است.
خروجی
Enter length and breadth respectively: 6
۷
Area: 42
Default Area when value is not taken from user
Area: 10
سربار گذاری سازنده
می توان چندین سازنده با نام یکسان (نام کلاس) تعریف کرد با این تفاوت که تعداد آرگومان های متفاوتی داشته باشند.
بسته به تعداد و نوع آرگومان های ارسال شده، سازنده خاص آن صدا زده می شود.
برای استفاده از دیگر سازنده ها، در هنگام ایجاد یک شیء آرگومان ها باید به سازنده ارسال شوند.
مثال ۲ : سربار گذاری سازنده
// Source Code to demonstrate the working of overloaded constructors
#include <iostream>
using namespace std;
class Area
{
private:
int length;
int breadth;
public:
// Constructor with no arguments
Area(): length(5), breadth(2) { }
// Constructor with two arguments
Area(int l, int b): length(l), breadth(b){ }
void GetLength()
{
cout << “Enter length and breadth respectively: “;
cin >> length >> breadth;
}
int AreaCalculation() { return length * breadth; }
void DisplayArea(int temp)
{
cout << “Area: ” << temp << endl;
}
};
int main()
{
Area A1, A2(2, 1);
int temp;
cout << “Default Area when no argument is passed.” << endl;
temp = A1.AreaCalculation();
A1.DisplayArea(temp);
cout << “Area when (2,1) is passed as argument.” << endl;
temp = A2.AreaCalculation();
A2.DisplayArea(temp);
return 0;
}
برای شی A1، هنگام ایجاد شیء، هیچ آرگومانی ارسال نمی شود.
بنابراین، سازنده بدون هیچ آرگومان فراخوانی شده است که طول را برابر ۵ و عرض را برابر ۲ قرار می دهد. بنابراین، مساحت شی A1 برابر ۱۰ خواهد بود.
برای شی A2، مقادیر ۲ و ۱ به عنوان آرگومان در هنگام ایجاد شی ارسال می شود.
بنابراین، سازنده با دو آرگومان فراخوانی می شود که طول را برابر ۲ و عرض را ۱ قرار می دهد. از این رو، مساحت شی A2 برابر ۲ خواهد بود.
خروجی
Default Area when no argument is passed.
Area: 10
Area when (2,1) is passed as argument.
Area: 2
سازنده کپی پیش فرض
یک شی را می توان با یک شی دیگر از همان نوع، مقدار دهی اولیه کرد. همانند کپی کردن محتویات یک کلاس را به کلاس دیگر.
در برنامه بالا، اگر می خواهید شی A3 را به گونه ای مقدار دهی کنید که مقادیر آن همانند A2 باشد، می توان به صورت زیر این کار را انجام داد:
….
int main()
{
Area A1, A2(2, 1);
// Copies the content of A2 to A3
Area A3(A2);
OR,
Area A3 = A2;
}
ممکن است فکر کنید، باید یک سازنده جدید برای انجام این کار ایجاد کنید اما سازنده دیگری نیاز نیست. به این دلیل که سازنده کپی پیش فرض در همه کلاس ها ساخته شده است.