Указатель this языка CPP

Любой метод класса самостоятельно определяет, для какого объекта он был вызван и "видит" другие члены класса без передачи их в качестве параметров. Зададимся вопросом: как это происходит?!

Ответ на этот вопрос не является секретом. Дело в том, что когда функция, принадлежащая классу, вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого функция вызвана. Этот указатель имеет фиксированное имя this и незаметно для программиста определен в каждой функции класса.

  1. Указатель this инициализируется значением адреса объекта, для которого вызван метод, перед началом выполнения кода этого метода.
  2. Имя this является служебным (ключевым) словом.
  3. Явно описать или определить указатель this нельзя.
  4. В соответствии с неявным определением this является константным указателем, т.е. изменять его нельзя, однако в каждой принадлежащей классу функции он указывает именно на тот объект, для которого функция вызывается.
  5. Объект, который адресуется указателем this, становится доступным внутри принадлежащей классу функции именно с помощью указателя this.
  6. Внутри функции - члена класса можно явно использовать этот указатель.

Указатель this является очень полезным, а иногда просто незаменимым. Например, в следующем коде указатель this позволяет компилятору разобраться в ситуации, когда имя компонента класса совпадает с именем формального параметра, принадлежащего методу:

# include <iostream>
using namespace std;

class Student	// Класс студент.
{    
	char name[50]; // имя
	char surname[50]; // фамилия
	int age; // возраст
public:
	//Конструктор: 
	Student(char name[],char surname[],int age)
	{ 
		// Компоненты и одноименные параметры: 
		strcpy(this->name,name);
		strcpy(this->surname,surname);
		this->age=age;
	}
	void Show()
	{ 
		// Здесь this является необязательным,
		// однако использовать его можно
		cout << "\nNAME - " << this->name; 
		cout << "\nSURNAME - " << this->surname; 
		cout << "\nAGE - " << this->age;
		cout << "\n\n";
	}
}; 

void main(void)
{ 
	Student A("Ivan","Sidoroff",25);	
	A.Show();
}