المؤشر 'this'
جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 7 من 104.
في لغة C++، يُعد this مؤشراً إلى الكائن الحالي. استخدم this-> للوصول إلى الأعضاء، خاصة عندما تتطابق أسماء المعلمات مع أسماء الأعضاء.
بدون this، يقوم المعامل بحجب العضو
void Player::setName(std::string name) {
name = name; // يقوم بتعيين المعامل لنفسه! العضو لم يتغير.
}استخدام this-> لتعيين القيم بشكل صحيح
void Player::setName(std::string name) {
this->name = name; // تعيين المعامل للعضو
}استخدام this-> في الدوال (methods)
std::string Player::getStatus() {
return this->name + " - Score: " + std::to_string(this->score);
}يشير المؤشر this دائمًا إلى مثيل الكائن الحالي. على عكس Java و C# حيث يكون this مرجعًا، فإنه في C++ عبارة عن مؤشر، لذا تستخدم -> بدلاً من . للوصول إلى الأعضاء.
التحدي
متوسطقم بتنفيذ دوال الفئة Player باستخدام this-> للتمييز بين الأعضاء والمعاملات التي لها نفس الاسم:
- دوال التعيين (Setter methods): استخدم
this->لتعيين المعاملات للأعضاء getStatus(): استخدمthis->للوصول إلى الأعضاء، وأرجع"<name> - Score: <score>, Level: <level>"
ورقة مرجعية
في لغة ++C، يُعد this مؤشراً إلى الكائن الحالي. استخدم this-> للوصول إلى الأعضاء، خاصةً عندما تتطابق أسماء المعاملات مع أسماء الأعضاء.
بدون this، يحجب المعامل العضو:
void Player::setName(std::string name) {
name = name; // يسند المعامل لنفسه! العضو لم يتغير.
}استخدام this-> لإسناد القيم بشكل صحيح:
void Player::setName(std::string name) {
this->name = name; // يسند المعامل للعضو
}استخدام this-> في الدوال (methods):
std::string Player::getStatus() {
return this->name + " - Score: " + std::to_string(this->score);
}يشير المؤشر this دائماً إلى مثيل الكائن الحالي. على عكس لغتي Java و #C حيث يكون this مرجعاً (reference)، فإنه في ++C عبارة عن مؤشر (pointer)، لذا تستخدم -> بدلاً من . للوصول إلى الأعضاء.
جرّب بنفسك
#include <iostream>
#include "Player.h"
int main() {
std::string name;
int score, level;
std::getline(std::cin, name);
std::cin >> score >> level;
Player player;
player.setName(name);
player.setScore(score);
player.setLevel(level);
std::cout << "Name: " << player.name << std::endl;
std::cout << "Score: " << player.score << std::endl;
std::cout << "Level: " << player.level << std::endl;
std::cout << player.getStatus() << std::endl;
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامة