كونست مرجع مؤهل على وظيفة عضو [مكررة]
-
21-12-2019 - |
سؤال
لقد رأيت في أنوزر هناك:يعود بمرجع رفالو أكثر كفاءة?
تعريف وظيفة العضو:
Beta_ab const& getAB() const& { return ab; }
أنا على دراية السيرة الذاتية-التصفيات (const
) على وظائف الأعضاء ، ولكن ليس const&
.
ماذا يفعل الأخير const&
يعني?
المحلول
ال &
هو المرجع-التصفيات.المرجع-التصفيات هي جديدة في 11 C ج وغير معتمدة حتى الآن في جميع المجمعين ، لذلك كنت لا ترى لهم في كثير من الأحيان حاليا.وهي تحدد أنه لا يمكن استدعاء هذه الوظيفة إلا على القيم (وليس على القيم):
#include <iostream>
class kitten
{
private:
int mood = 0;
public:
void pet() &
{
mood += 1;
}
};
int main()
{
kitten cat{};
cat.pet(); // ok
kitten{}.pet(); // not ok: cannot pet a temporary kitten
}
جنبا إلى جنب مع السيرة الذاتية المؤهلة const
, ، فهذا يعني أنه يمكنك فقط استدعاء وظيفة العضو هذه على لفالويس ، وقد تكون تلك كونست.
نصائح أخرى
نحن نعلم ذلك في هذا الرمز...
Beta_ab const& getAB() const { return ab; }
^^^^^
أبرز const
يعني أنه يمكن استدعاء وظيفة العضو على أ const
كائن.يمكن دائما استدعاء وظيفة العضو على غير-const
كائن بغض النظر عن وظيفة السيرة الذاتية التأهيل.
لذلك في هذا الرمز...
Beta_ab const& getAB() const & { return ab; }
^
يجب أن نتوقع أن أبرز &
يقول أيضا شيئا عن أنواع الكائنات التي يسمح باستدعاء وظيفة العضو هذه.سنكون على صواب;في 11 دولارا أمريكيا ، يشير هذا إلى أنه لا يجوز استدعاء وظيفة العضو إلا للقيم.
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
في المثال أعلاه ، يتم استدعاء الحمل الزائد الأول على القيم ، ويتم استدعاء الحمل الزائد الثاني على غير-const
القيم.على غرار المثال الأكثر شيوعا التالي ، مع تطبيق المؤهلات على معلمات الوظيفة العادية:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
إنه يعمل بشكل مختلف قليلا بالنسبة للمعلمات العادية ، كما في هذا المثال ، فإن الحمل الزائد الأول سيقبل قيمة إذا تمت إزالة الحمل الزائد الثاني.