Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

C++التفرقة بين باراميترات الدوال و خصائص الكلاس

العامل this-> يقال له This Pointer, و هم يستخدم للتفرقة بين باراميترات الدوال و الخصائص الموجودة في الكلاس مما يجعلك قادر على وضع نفس الأسماء للبارميترات و الخصائص و تجنب حدوث أي أخطاء منطقية بسبب الأسماء المتشابهة.

الآن, سنضع لك عدة أمثلة حتى تلاحظ الأخطاء المنطقية التي قد تقع فيها بسبب الأسماء المتشابهة و كيف أن العامل this-> يحل لك هذه المشكلة.


في المثال التالي, قمنا بتعريف كلاس إسمه Book يمثل المعلومات التي يمكن أن يتضمنها أي كتاب كعنوانه, إسم المؤلف, سعره و عدد صفحاته.
في الكلاس Book بتعريف دالة إسمها setTitle() عند استدعاءها نمرر لها نص فيتم وضعه كعنوان للكائن الذي قام باستدعائها.

المثال الأول

main.cpp
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
    
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير t نمرر لها قيمة مكان الباراميتر 
    void setTitle(string t)
    {
        title = t;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
    
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
    
    return 0;
}

سنحصل على النتيجة التالية عند التشغيل.

Title: C++ for beginners


في حال قمنا بإعادة المثال السابق مع إجراء تعديل بسيط عليه بحيث نجعل إسم الباراميتر الموضوع في الدالة setTitle() هو نفسه إسم المتغير title الموجود في الكلاس سيظهر لنا مشكلة منطقية عند تشغيل البرنامج كما سنرى في نتيجة التشغيل.

المثال الثاني

main.cpp
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
    
    // title نمرر لها قيمة مكان الباراميتر  Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    void setTitle(string title)
    {
        // الموجود في الكلاس title بداخله من جديد. أي لن يتم تمريرها للمتغير title هنا كأننا قلنا, أعد وضع القيمة التي نمررها للباراميتر
        // لأنهما يملكان نفس الإسم title سبب هذه المشكلة أن المترجم لن يعرف أنك تقصد أنك تريد تمرير القيمة التي تمررها للدالة, إلى المتغير
        title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
    
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
    
    return 0;
}

سنحصل على النتيجة التالية عند التشغيل.
لاحظ أن القيمة التي مررناها للدالة setTitle() لم يتم تمريرها للمتغير title الموجود في الكائن book و هذا ما كنا نقصده بخطأ منطقي.

Title:


لحل المشكلة المنطقة التي شاهدناها في المثال الثاني, أي لجعل المترجم قادر على التفرقة بين البارميترات و المتغيرات الموجودة في الكلاس سنستخدم العامل this-> كلما أردنا الإشارة إلى المتغيرات الموجودة في الكلاس.

المثال الثالث

main.cpp
#include <iostream>

using namespace std;

// يحتوي على 4 متغيرات Book هنا قمنا بتعريف كلاس إسمه
class Book {

public:
    // هنا قمنا بتعريف خصائص الكلاس
    string title;
    string author;
    double price;
    int numberOfPages;
    
    // Book عند استدعاءها من أي كائن ننشئه من setTitle هنا قمنا بتعريف دالة إسمها
    // الذي يملكه الكائن title فتقوم بوضعها كقيمة للمتغير title نمرر لها قيمة مكان الباراميتر 
    void setTitle(string title)
    {
        this->title = title;
    }
};


// main() هنا قمنا بتعريف الدالة
int main()
{
    // book إسمه Book هنا قمنا بتعريف كائن من
    Book book;

    // book الخاص بالكائن title و تمرير نص لها حتى تقوم بتخزينه في المتغير book من الكائن setTitle() هنا قمنا باستدعاء الدالة
    book.setTitle("C++ for beginners");
    
    // للتأكد ما إن كانت قد تغيرت أم لا book الموجود في الكائن title هنا قمنا بطباعة قيمة المتغير
    cout << "Title: " << book.title;
    
    return 0;
}

سنحصل على النتيجة التالية عند التشغيل.

Title: C++ for beginners