default arguments ممكن شرحها
[ تمت الإجابة ]ماهي الوسائط الافتراضية ؟
تظهر فائدة الوسيط الإفتراضي إذا لم تُمرر له قيمة, حيث يحتفظ بقيمته الإفتراضية.
يتم الإعلان عن الوسائط الإفتراضية عن طريق إسناد قيم افتراضية لها في النموذج المصغر للدالة, مثلاً:
int myFunc(int x= 10) ;
فهذه الدالة يمكن استدعاؤها هكذا:
c= myFunc(25) ;
لتكون قيمة x مساوية لـ 25. أو هكذا:
c= myFunc() ;
لتكون قيمة x مساوية لـ 10 لأنه تم تجاهل تمرير قيمة لهذا الوسيط, و بالتالي احتفظ الوسيط بقيمته الإفتراضية.
لاحظ أن القيم المفترضة توضع في النموذج المصغر فقط, أما ترويسة الدالة فتبقى:
int myFunc(int x)
أخيرا, هناك 3 ملاحظات مهمة :
- يتم تعيين القيم المفترضة بالموقع وليس بالاسم, لذلك ليس من الضروري أن يطابق اسم الوسيط في النموذج المصغر اسمه في التعريف.
- عند تعيين قيمة مفترضة لوسيط ما, يجب تعيين قيم مفترضة لكل الوسائط بعده.
- في حال كان هناك أكثر من وسيط مفترض في دالة واحدة, فلا يمكن عند الاستدعاء تمرير قيمة لأحد هذه الوسائط المفترضة دون تمرير قيمة للوسيط المفترض الذي يسبقه.
بالتوفيق.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
عفواً, حذفتُ سؤالك الثاني عن طريق الخطأ ! آسف.
أعتقد أن سؤالك كان عن سبب الخطأ في الكود التالي و لماذا :
#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
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
شكرآ على مساعدتك
لكن ممكن توضح الملاحظات 1 و3
اقتباسيتم تعيين القيم المفترضة بالموقع وليس بالاسم, لذلك ليس من الضروري أن يطابق اسم الوسيط في النموذج المصغر اسمه في التعريف.
المثال السابق مع تعديل خفيف :
#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;
}السبب هو أننا قمنا بتمرير قيمة إلى الوسيط الثاني و لم نمرر أي شيء للوسيط الأول.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :