مهندس موفق الکترونیک

Overloading عملگر و تابع در ++C

++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 را نیز اورلود یا بازتعریف کرد. بنابراین، یک برنامه‌نویس می‌تواند عملگرها را برای نوع داده‌های تعریف شده توسط کاربر نیز به کار گیرد.

مطلب پیشنهادی:  تابع سازنده کپی در ++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

عملگرهایی با قابلیت اورلود و عملگرهایی بدون قابلیت اورلود

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

مطلب پیشنهادی:  اینترفیس‌ها در ++C (کلاس‌های انتزاعی)

+

* / % ^

&

| ~ ! ,

=

>

< <= >= ++

>> << == !=

&&

||

=+

-= /= %= ^=

&=

|=

*= <<= >>=

[]

()

-> ->* new new [] delete

delete []

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

::

.* .

?:

مثال‌هایی از اورلود عملگرها

در زیر مثال‌های متنوعی آمده که به فهم بهتر مفهوم کمک می‌کند.

ردیف

عملگرها و مثال‌ها

1

اورلود عملگرهای یگانی

2

اورلود عملگرهای باینری

3

اورلود عملگرهای رابطه‌ای

4

اورلود عملگرهای ورودی/خروجی

5

اورلود عملگرهای ++  و – –

6

اورلود عملگرهای تخصیص

7

اورلود عملگر فراخوانی تابع ()

8

اورلود عملگر []Subscripting 

9

-> اورلود عملگر دسترسی عضو

 

منبع: ترجمه از سایت tutorialspoint.com

امیدواریم آموزش Overloading عملگر و تابع در ++C براتون مفید واقع شده باشه. در جلسه بعدی آموزش ++C با ما همراه باشید. اگر یادگرفتین ما را هم دعا کنید.

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

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>
مطلب پیشنهادی:  اشاره‌گر this در ++C

دیدگاهتان را بنویسید

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