c++ - هل من الممكن الحصول على عنوان المؤشر "هذا"؟




reference this (3)

أنا أتساءل ما الذي قد يعطي عنوان this ؟ أو كلاهما مخطئون؟

لا هو عنوان this ، لأن آلة الملخص C ++ لا تحدد عنوانًا له. this مثل 0 . لا يمكنك الحصول على عنوان 0 ، إنه ليس كيانًا ذا مساحة تخزينية ، ولكن له بعض القيمة فقط. فماذا يعني هذا أن تفعل؟

int const& i = 0;

يقوم بإنشاء كائن مؤقت ، وتهيئته بـ 0 ، ثم يقوم بربط الإشارة إليه. يحدث الشيء نفسه بالضبط في التعليمات البرمجية الخاصة بك. يمكنك إنشاء مراجع لكائنات مؤقتة مختلفة تحمل قيمة this .

this هي الكلمة الأساسية التي تقف لعنوان الكائن الذي يتم تنفيذ وظيفة العضو من أجله. لا تتطلب آلة الملخص C ++ أن تشغل مساحة التخزين ، لذا فهي دائمًا (منطقية) مجرد قيمة بسيطة ، مثل 0.

هناك ميزة لعدم طلب this لشغل التخزين. يسمح بتطبيق C ++ على ABI حيث يتم تمرير ذلك في سجل (شيء لا يمكن معالجته بشكل طبيعي). إذا كان يجب تحديد this جيدًا ، أي إذا كان لابد من معالجة ذلك ، فذلك سيمنع تنفيذ من استخدام سجل لتمرير العنوان. يهدف معيار C ++ بشكل عام إلى عدم ربط التطبيقات بهذه الطريقة.

قرأت أن this هو rvalue ولا يمكننا الحصول على عنوانه عن طريق تطبيق &this .

في الكود الخاص بي ، لقد حاولت استخدام مرجع ملزم this . أنا أتساءل الطريقة التي سوف تعطي عنوان this ؟ أو كلاهما خطأ؟

ما this بالضبط؟ قيمة ، أو قيمة ، أو كلمة رئيسية ، أو أي شيء آخر؟

void MyString::test_this() const{
    std::cout << "this: " << this << std::endl;
    const MyString * const& this_ref = this;
    std::cout << "thie_ref: " << &this_ref << std::endl;
    const MyString * const&& this_right = this;
    std::cout << "thie_right: " << &this_right << std::endl;
}

//this: 00CFFC14
//thie_ref: 00CFFB14
//thie_right: 00CFFAFC

المقصود بعبارة "لا يمكنك تحمل عنوان this " هو أنه لا يمكنك الكتابة &this .

أنت تسأل عن العنوان الذي يمثله this المؤشر ، أليس كذلك؟ هذا هو ، ما يفعله الإخراج الأول الخاص بك.

this نفسه لا يتحقق كمؤشر ، مثل: MyString* x سيكون. هنا ، لدى x نفسه موقع في الذاكرة ويمكنك القيام به. مثل &x . هذا غير ممكن this .

الإجابة على سؤالك الأخير هي: نعم ، this كلمة أساسية. التعبير this هو تعبير أساسي. يمكنك أن تقرأ عنها في القسم [expr.prim.this] من معيار C ++.


this مؤشر يحتوي على عنوان current object . إنه ليس متغيرًا يتم تخزينه في مكان ما (أو حتى يمكن تغييره) ، إنه كلمة أساسية خاصة ذات خصائص خاصة.

إذا كنت تريد معرفة عنوان "الكائن الحالي" ، يمكنك ببساطة الإخراج كما هو موضح أدناه في البرنامج:

#include<iostream>

using namespace std;

class Test
{
    public:
            void fun()
            {
                    cout << "Address of this :: " << this << endl;
                    void *ptr = this;
                    cout << "Addrss of ptr :: " << ptr << endl;
            }
 };

 int main()
 {
    Test obj;

    cout << "Address of obj :: " << &obj << endl;

    obj.fun();

    return 0;
 }

فوق البرنامج ينتج أدناه الإخراج:

عنوان obj :: 0x7fffef913627

عنوان هذا :: 0x7fffef913627

Addrss من ptr :: 0x7fffef913627

اتمني ان يكون مفيدا!





rvalue