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

الكلمةالمفتاحية explicit

بدأه linuxbybelkacem في 25 مارس 2011 · 5 رد · 774 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله تعالى وبركاته

وجدت هذا المثال حول الكلمة explicit وأردت مشاركته معكم

الكل يعلم أن أي صنف في يحوي دال بناء لهذا الصنف ويمكن لدالة البناء أن تأخذ parameter أو أكثر ويمكن أن نستخدم الدالة للتحويل بين الأنماط مثال

class A {
        public:
                A(int);
        };

        void f(A) {}

        void g()
        {
                A a1 = 37;

                A a2 = A(47);

                A a3(57);

                a1 = 67;

                f(77);
        }

ولجعل دالة البناء في المثال الماضي لا تقوم بتحويل النمط نستخدم الكلمة المفتاحية كما يلي

class A {
        public:
                explicit A(int);
        };

        void f(A) {}

        void g()
        {
                A a1 = 37;      // illegal

                A a2 = A(47);   // OK

                A a3(57);       // OK

                a1 = 67;        // illegal

                f(77);          // illegal
        }

وهي تشبه السطر التالي

float a = 3.14......
int s = int (a)

ولكن هناك سؤال يحيرني لماذا سأستخدم explicit أليس من الأفضل عدم استخدامها نهائيا ؟؟؟؟ وماهي استخداماتها ننتظر الخبراء

1
#2
linuxbybelkacem كتب:

السلام عليكم ورحمة الله تعالى وبركاته

وجدت هذا المثال حول الكلمة explicit وأردت مشاركته معكم

الكل يعلم أن أي صنف في يحوي دال بناء لهذا الصنف ويمكن لدالة البناء أن تأخذ parameter أو أكثر ويمكن أن نستخدم الدالة للتحويل بين الأنماط مثال

class A {
        public:
                A(int);
        };

        void f(A) {}

        void g()
        {
                A a1 = 37;

                A a2 = A(47);

                A a3(57);

                a1 = 67;

                f(77);
        }

ولجعل دالة البناء في المثال الماضي لا تقوم بتحويل النمط نستخدم الكلمة المفتاحية كما يلي

class A {
        public:
                explicit A(int);
        };

        void f(A) {}

        void g()
        {
                A a1 = 37;      // illegal

                A a2 = A(47);   // OK

                A a3(57);       // OK

                a1 = 67;        // illegal

                f(77);          // illegal
        }

وهي تشبه السطر التالي

float a = 3.14......
int s = int (a)

ولكن هناك سؤال يحيرني لماذا سأستخدم explicit أليس من الأفضل عدم استخدامها نهائيا ؟؟؟؟ وماهي استخداماتها ننتظر الخبراء

؟؟؟؟؟؟؟؟؟؟؟؟؟؟’’’’’’’’’’’

#3
linuxbybelkacem كتب:

؟؟؟؟؟؟؟؟؟؟؟؟؟؟’’’’’’’’’’’

فائدتها أنها تجعل الConstructer لا يقوم بأي تحويل ضمني "Implicit conversion". لأنه في حالات كثيره قد يقوم الكمبيايلر بإستخدم الconstructor في عملية التحويل . فمن باب الأمان يجب منعه . خصوصاً إذا كنت تتعامل مع ملفات أو ذاكره ولا تريد هدرها بدون سبب .

أتمنى إني أفدتك .

1
#4

السلام عليكم

وايضاً هنا اجابة بالإنجليزية من المصدر للمقال ربما وللمثال ايضاً

Using the explicit keyword, a constructor is declared to be

"nonconverting", and explicit constructor syntax is required:

استعمالها بكون في حالات خاصة متل الموجودة بمشاركة المكرم b.m.s

هذا لو كان الموضوع سؤالاً واستفسار

لو كان نقاشاً عن الأفضلية ووو فسأكون متابعة فقط للإستفادة

شكراً

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#5

شكرا

حسب مافهمت

أن الكلمة المتاحية هذه تستخدم لمنع الصنف من تغيير نوعه مثلا

يعني اذا لم نستخدم هذه الكلمة المفتاحية فسيتحول الكائن من نوع الصنف الى نوع القيمة الممررة لدالة البناء أليس كذلك (مثلا int )

ولكن لدي استفسار آخر

ماذا لو أن دالة البناء تأخذ أكثر من parameter ؟؟؟؟؟؟ ممكن شرح أكثر في هذه النقطة

#6

موضوع مكرر... حاول البحث جيداً في المنتدى ستجد الكثير من المواضيع حول النقاط التي تطرحها:

مافائدة الكلمة المحجوزة Explicit

Using Explicit In Constructor مقاله بسيطه حول استخدام explicit

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