
در روش فراخوانی با مقدار مقدار واقعی به تابع ارسال میشود. با این حال روش دیگری نیز برای ارسال آرگومانها به تابع وجود دارد که در آن مقدار واقعی آرگومان ارسال نمیشود، بلکه به جای آن تنها ارجاعی به آن مقدار ارسال خواهد شد.
مثال 1: ارسال با مقدار
#include <iostream> using namespace std; void increment(int x) { x = x + 1; } int main() { int a = 5; increment(a); // اینجا a همچنان 5 خواهد بود return 0; }
اینجا به تابع increment مقدار a (که ۵ است) ارسال میشود. درون تابع، x متغیر محلی است که مقدار «۵» را دارد. وقتی x = x + 1; انجام میشود، x میشود ۶، ولی a در main تغییر نمیکند چون تابع با کپی کار کرده است، نه با «ارجاع» به a.
مزایا و معایب
مزایا:
ایمنی بیشتر: تابع نمیتواند بطور ناگهانی متغیر اصلی را تغییر دهد، چون با کپی کار میکند.
سادهتر برای درک و پیادهسازی (بخصوص برای متغیرهای ساده).
معایب:
اگر متغیر بزرگ باشد (مثلاً یک ساختار یا کلاس سنگین)، کپی کردن ممکن است هزینهبر باشد.
اگر بخواهیم تابع متغیر اصلی را تغییر دهد، با این روش نمیتوانیم (مگر با بازگشت مقدار یا ارسال ارجاع).
مثال 2: ارسال با ارجاع
به دو روش است:
1.ارسال با ارجاع بدون اشارهگر
مثال:
#include <iostream> using namespace std; // Function prototype void swap(int&, int&); int main() { int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; swap(a, b); cout << "\nAfter swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void swap(int& n1, int& n2) { int temp; temp = n1; n1 = n2; n2 = temp; }
خروجی
Before swapping a = 1 b = 2 After swapping a = 2 b = 1
در تابع ()main دو مقدار صحیح به نامهای a و b تعریف کردهایم. این مقادیر صحیح به تابع ()swap به صورت با ارجاع ارسال میشوند. کامپایلر میتواند تشخیص دهد که این مقادیر به صورت با ارجاع ارسال شدهاند، زیرا تعریف تابع به صورت زیر است:
void swap(int& n1, int& n2)
علامت & پس از نوع داده نشاندهنده ارجاعی بودن آن است. تنها ارجاع (آدرس) متغیرهای a و b در تابع swap() دریافت میشوند و تعویض مقادیر در آدرس اصلی متغیرها صورت میگیرد. در تابع ()swap، مقادیر n1 و n2 آرگومانهای صوری هستند که در عمل به ترتیب برابر با a و b هستند.
2. ارسال با ارجاع با استفاده از اشارهگرها
#include <iostream> using namespace std; // Function prototype void swap(int*, int*); int main() { int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; swap(&a, &b); cout << "\nAfter swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void swap(int* n1, int* n2) { int temp; temp = *n1; *n1 = *n2; *n2 = temp; }
آدرس متغیر در طی فراخوانی تابع به جای خود متغیر ارسال میشود.
swap(&a, &b); // &a is address of a and &b is address of b
از آنجا که آدرس به جای مقدار ارسال شده است، عملگر «ارجاعزدایی» (dereference) باید برای دسترسی به مقدار ذخیره شده در آن آدرس مورد استفاده قرار گیرد:
void swap(int* n1, int* n2) { ... .. ... }
و n2 به ترتیب مقدارهای ذخیره شده در آدرسهای n1 و n2 را به دست میدهند. از آنجا که n1 شامل آدرس a است، هر تغییری که روی n1* اجرا شود، مقدار a در تابع ()main نیز تغییر مییابد.
Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com