++C به شما اجازه میدهد تا در یک دامنه مشخص، بیش از یک تعریف برای یک تابع یا یک عملگر مشخص کنید، که به ترتیب اضافه بار تابع (function overloading) و اضافه بار عملگر (operator oveloading) نامیده میشود.
یک اعلان اورلود شده، اعلانی است که دارای نام و دامنه یکسانی با یک اعلان پیشین است، با این تفاوت که آرگومانهای متفاوت و طبیعتاً تعریف متفاوتی از اعلان قبلی خواهد داشت.
هنگام تعریف یک تابع یا عملگر اورلود شده، کامپایلر نوع آرگومانهایی که در فراخوانی تابع یا عملگر استفاده کردهاید را با نوع پارامترهای تعیین شده در تعریف مقایسه کرده و مناسبترین تعریف را انتخاب میکند. فرآیند انتخاب مناسبترین تابع یا عملگر اورلود شده overload resolution خوانده میشود.
اورلود تابع در ++C
میتوان برای یک نام تابع در یک دامنه مشخص، چندین تعریف ارائه کرد. تعاریف تابع باید از حیث نوع/تعداد آرگومانها متفاوت باشند. نمیتوان تابع اورلود شدهای اعلان کرد که تنها از لحاظ نوع داده برگشتی متفاوت باشد.
مثال زیر تابع ()print را برای چاپ نوع دادههای متفاوت به کار میبرد.
#include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Printing int: " << i << endl; } void print(double f) { cout << "Printing float: " << f << endl; } void print(char* c) { cout << "Printing character: " << c << endl; } }; int main(void) { printData pd; // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello C++"); return 0; }
با اجرای برنامه فوق، خروجی زیر تولید میشود.
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
اورلود عملگرها در ++C
میتوان عملگرهای درونی ++C را نیز اورلود یا بازتعریف کرد. بنابراین، یک برنامهنویس میتواند عملگرها را برای نوع دادههای تعریف شده توسط کاربر نیز به کار گیرد.
عملگرهای اورلود شده توابعی با نام ویژه هستند: کلیدواژه «operator» و به دنبال آن علامت عملگر تعریف شونده.
مانند هر تابع دیگری، عملگر اورلودشده یک نوع داده بازگشتی و یک لیست پارامتر دارد.
Box operator+(const Box&);
عبارت فوق عملگر جمع را برای اضافه کردن دو شی Box و بازگرداندن Box حاصله به کار میگیرد. اکثر عملگرهای اورلود شده را میتوان به عنوان توابع غیرعضو معمولی و یا توابع عضو کلاس تعریف کرد. در حالتی که این توابع را به عنوان توابع غیرعضو یک کلاس تعریف کنیم، مجبور خواهیم بود که برای هر عملوند، دو آرگومان به صورت زیر ارسال کنیم.
Box operator+(const Box&, const Box&);
مثال زیر مفهوم اورلود عملگر را با استفاده از یک تابع عضو نشان میدهد. در اینجا یک شی به صورت آرگومان به تابع ارسال میشود و خصوصیات آن از طریق نام آرگومان قابل دسترسی هستند، اما برای دسترسی به خصوصیات شی که عملگر را فراخوانی میکند از کلیدواژه this استفاده میشود.
#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // Overload + operator to add two Box objects. Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program int main() { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box Box Box3; // Declare Box3 of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 specification Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // volume of box 1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Add two object as follows: Box3 = Box1 + Box2; // volume of box 3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }
با اجرای این کد، خروجی زیر حاصل میگردد.
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
عملگرهایی با قابلیت اورلود و عملگرهایی بدون قابلیت اورلود
در زیر لیست عملگرهایی که قابلیت اورلود دارند آمده است.
+ |
– | * | / | % | ^ |
& |
| | ~ | ! | , |
= |
> |
< | <= | >= | ++ |
— |
>> | << | == | != |
&& |
|| |
=+ |
-= | /= | %= | ^= |
&= |
|= |
*= | <<= | >>= |
[] |
() |
-> | ->* | new | new [] | delete |
delete [] |
و در زیر نیز لیست عملگرهایی که قابلیت اورلود ندارند گردآوری شده است.
:: |
.* | . |
?: |
مثالهایی از اورلود عملگرها
در زیر مثالهای متنوعی آمده که به فهم بهتر مفهوم کمک میکند.
ردیف |
عملگرها و مثالها |
1 |
اورلود عملگرهای یگانی |
2 |
اورلود عملگرهای باینری |
3 |
اورلود عملگرهای رابطهای |
4 |
اورلود عملگرهای ورودی/خروجی |
5 |
اورلود عملگرهای ++ و – – |
6 |
اورلود عملگرهای تخصیص |
7 |
اورلود عملگر فراخوانی تابع () |
8 |
اورلود عملگر []Subscripting |
9 |
-> اورلود عملگر دسترسی عضو |
انواع اورلودکردن
برای مطالعه انواع اورلودکردن لینکهای زیر را مطالعه کنید. مطالعه این لینکها از شما برنامه نویسی حرفهای تری را خواهد ساخت.
- اورلودکردن عملگر افزایش (++) و عملگر کاهش (- -)
- اورلود کردن عملگرهای یگانی در ++C
- اورلود کردن عملگرهای باینری در ++C
- اورلود کردن عملگرهای رابطهای در ++C
- اورلود کردن عملگرهای ورودی/خروجی در ++C
- اورلود کردن عملگر دسترسی کلاس (->) در ++C
- اورلود کردن عملگر ایندکس در ++C
- اورلود کردن عملگر فراخوانی تابع () در ++C
منبع: ترجمه از سایت tutorialspoint.com
امیدواریم آموزش Overloading عملگر و تابع در ++C براتون مفید واقع شده باشه. در جلسه بعدی آموزش ++C با ما همراه باشید. اگر یادگرفتین ما را هم دعا کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.