الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]ماهي الوسائط الافتراضية ؟

بدأه طالبة c++ في 20 نوفمبر 2012 · 4 رد · 882 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

default arguments ممكن شرحها

#2

تظهر فائدة الوسيط الإفتراضي إذا لم تُمرر له قيمة, حيث يحتفظ بقيمته الإفتراضية.

يتم الإعلان عن الوسائط الإفتراضية عن طريق إسناد قيم افتراضية لها في النموذج المصغر للدالة, مثلاً:

int myFunc(int x= 10) ;

فهذه الدالة يمكن استدعاؤها هكذا:

c= myFunc(25) ;

لتكون قيمة x مساوية لـ 25. أو هكذا:

c= myFunc() ;

لتكون قيمة x مساوية لـ 10 لأنه تم تجاهل تمرير قيمة لهذا الوسيط, و بالتالي احتفظ الوسيط بقيمته الإفتراضية.

لاحظ أن القيم المفترضة توضع في النموذج المصغر فقط, أما ترويسة الدالة فتبقى:

int myFunc(int x)

أخيرا, هناك 3 ملاحظات مهمة :

  • يتم تعيين القيم المفترضة بالموقع وليس بالاسم, لذلك ليس من الضروري أن يطابق اسم الوسيط في النموذج المصغر اسمه في التعريف.
  • عند تعيين قيمة مفترضة لوسيط ما, يجب تعيين قيم مفترضة لكل الوسائط بعده.
  • في حال كان هناك أكثر من وسيط مفترض في دالة واحدة, فلا يمكن عند الاستدعاء تمرير قيمة لأحد هذه الوسائط المفترضة دون تمرير قيمة للوسيط المفترض الذي يسبقه.

بالتوفيق.

#3

عفواً, حذفتُ سؤالك الثاني عن طريق الخطأ ! آسف.

أعتقد أن سؤالك كان عن سبب الخطأ في الكود التالي و لماذا :

#include<iostream>
using namespace std;
int boxvolume(int length = 1, int width = 1, int height = 1);

int main() {
    cout << boxvolume();
    cout << boxvolume(10);
    cout << boxvolume(10, 5, 2);
    return 0;
}

int boxvolume(int length = 1, int width = 1, int height = 1) {
    return length * width*height;
}

و الجواب :

لا يُمكن إعادة تعريف القيم الافتراضية للوسائط.

تصحيح الكود :

#include<iostream>
using namespace std;
int boxvolume(int length = 1, int width = 1, int height = 1);

int main() {
    cout << boxvolume() << endl;
    cout << boxvolume(10) << endl;
    cout << boxvolume(10, 5, 2) << endl;
    return 0;
}

int boxvolume(int length, int width, int height) {
    return length * width*height;
}

تم تعديل هذه المشاركة بواسطة Sn@CkeR في 20 نوفمبر 2012 في 22:11

#4

شكرآ على مساعدتك

لكن ممكن توضح الملاحظات 1 و3

#5
اقتباس
يتم تعيين القيم المفترضة بالموقع وليس بالاسم, لذلك ليس من الضروري أن يطابق اسم الوسيط في النموذج المصغر اسمه في التعريف.

المثال السابق مع تعديل خفيف :

#include<iostream>
using namespace std;
int boxvolume(int length = 1, int width = 2, int height = 3);

int main() {
    cout << "boxvolume() = " << boxvolume() << endl;
    cout << "boxvolume(10) = " << boxvolume(10) << endl;
    cout << "boxvolume(10,5,2) = " << boxvolume(10, 5, 2) << endl;
    return 0;
}

int boxvolume(int l, int w, int h) {
    return l * w * h;
}

أسماء الوسائط في النموذج المصغر : length, width, height.

أسماء الوسائط في تعريف الدالة : l, w, h.

و بالنالي لا يُشترط تطابق الأسماء في النموذج المصغر و تعريفد الدالة. لأن التفريق بينهم يتم على أساس الموقع و ليس الإسم, فمثلا الــ Compiler يعرف أن الوسيط الأول قيمته الافتراضية 1 و الوسيط الثاني قيمته الافتراضية 2 و الوسيط الثالث قيمته الافتراضية 3 و بالتالي تغيير الأسماء لا يهم.

اقتباس
في حال كان هناك أكثر من وسيط مفترض في دالة واحدة, فلا يمكن عند الاستدعاء تمرير قيمة لأحد هذه الوسائط المفترضة دون تمرير قيمة للوسيط المفترض الذي يسبقه.

عند تنفيذ المثال التالي ستحصلين على خطأ منطقي في التنفيذ (انظري قيمة المتغير الحرفي عند الاستدعاء الثاني)

#include<iostream>
using namespace std;
void func(char a = 'Z', float b = 9.2);

int main() {
    func('Q',3.1);
    cout <<"--------"<<endl;
    func(12.09);
    return 0;
}

void func(char x, float y) {
    cout <<"char = "<< x<<endl;
    cout <<"float = "<< y<<endl;
}

السبب هو أننا قمنا بتمرير قيمة إلى الوسيط الثاني و لم نمرر أي شيء للوسيط الأول.

1

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…