powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель this
15 сообщений из 15, страница 1 из 1
указатель this
    #38098695
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет! Читаю такое и не понимаю, что имеется ввиду:
авторВ прошлом уроке мы выяснили, что любой метод класса самостоятельно определяет, для какого объекта он был вызван и "видит" другие члены класса без передачи их в качестве параметров. Зададимся вопросом: как это происходит?!

Ответ на этот вопрос не является секретом. Дело в том, что когда функция, принадлежащая классу, вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого функция вызвана. Этот указатель имеет фиксированное имя this и незаметно для программиста определен в каждой функции класса.
Буду очень благодарен за расширенный комментарий!
...
Рейтинг: 0 / 0
указатель this
    #38098713
Nagdiel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximuS_G,

Когда компилятор переводит исходный код в машинный код, он неявно увеличивает на 1 число параметров для методов класса, добавляя в список параметров указатель на вызывающий объект. Далее обращение к данным класса выполняется с помощью этого указателя. Средства языка скрывают эти детали, но при необходимости можно явно использовать указатель на вызывающий класс при помощи ключевого слова this, т.е. для класса

Код: plaintext
1.
2.
3.
4.
5.
6.
class Example
{
	int a;
public:
	int getA();
};



эти определения метода getA эквиваленты
1)

Код: plaintext
1.
2.
3.
4.
int Example::getA()
{
	return a;
}



и 2)

Код: plaintext
1.
2.
3.
4.
int Example::getA()
{
	return this->a;
}
...
Рейтинг: 0 / 0
указатель this
    #38098716
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того, после компиляции это в любом случае выглядит так:
Код: sql
1.
2.
3.
4.
int getA(Example* this)
{
   return this->a;
}


С виртуальными методами чуть сложнее, но принцип тот же: вызывается обычная процедура с
одним дополнительным параметром.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
указатель this
    #38098805
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nagdiel , Dimitry Sibiryakov
Спасибо за объяснение, вроде понятно.
Теперь еще вопросик маленький появился.
Nagdiel описал метод за пределами класса, это нормальная практика так делать? В каких случаях так нужно делать?
...
Рейтинг: 0 / 0
указатель this
    #38098809
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GNagdiel описал метод за пределами класса
Где???

Ты случайно не путаешь описание с реализацией?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
указатель this
    #38098812
Nagdiel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximuS_G,

Да самая что ни есть обычная практика, обычно в h-файле пишут только объявление (суть интерфейс класса), реализацию выносят в cpp-файл. Прямо в интерфейсе описывают реализацию только в случае очень коротких методов, ну или что-то типа инициализации полей класса в конструкторе. Подумайте сами, если у вас метод getA() - не одна строчка, а несколько десятков, и такой метод не один - то насколько трудно будет понять что делает данный класс?

Более того, даже если речь не о классах, а просто об отдельных функциях подход остается примерно таким же. В h-файле дают только объявление, а реализацию все равно в cpp-файле. В Delpi/pascal есть аналогичная штука - модуль разделяется на секцию interface и implementation.
...
Рейтинг: 0 / 0
указатель this
    #38098815
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMaximuS_GNagdiel описал метод за пределами класса
Где???

Ты случайно не путаешь описание с реализацией?..

Да, спутал с реализаций)

NagdielДа самая что ни есть обычная практика, обычно в h-файле пишут только объявление (суть интерфейс класса), реализацию выносят в cpp-файл. Прямо в интерфейсе описывают реализацию только в случае очень коротких методов, ну или что-то типа инициализации полей класса в конструкторе. Подумайте сами, если у вас метод getA() - не одна строчка, а несколько десятков, и такой метод не один - то насколько трудно будет понять что делает данный класс?

Более того, даже если речь не о классах, а просто об отдельных функциях подход остается примерно таким же. В h-файле дают только объявление, а реализацию все равно в cpp-файле. В Delpi/pascal есть аналогичная штука - модуль разделяется на секцию interface и implementation.
Ясно, спасибо большое! :)

Всем удачи!)
...
Рейтинг: 0 / 0
указатель this
    #38098902
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GДа, спутал с реализаций)
Тогда тут необходимо понимать что такое inline-функции. Если реализацию написать прямо в
заголовке, а потом включить этот заголовок в 100500 модулей, то в результирующем экзешнике
будут 100500 копий этого кода.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
указатель this
    #38098906
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMaximuS_GДа, спутал с реализаций)
Тогда тут необходимо понимать что такое inline-функции. Если реализацию написать прямо в
заголовке, а потом включить этот заголовок в 100500 модулей, то в результирующем экзешнике
будут 100500 копий этого кода.

Спасибо за комментарий!
...
Рейтинг: 0 / 0
указатель this
    #38098909
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nagdielто насколько трудно будет понять что делает данный класс?
Ну как-то же с этим в java и c# справляются...
Наверное с помощью того, что редактор автоматом сворачивает весь код ))

В настоящее время вынос реализации в отдельное место должен преследовать иные цели. Удобства при чтении это никак не добавляет.
...
Рейтинг: 0 / 0
указатель this
    #38098921
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonВ настоящее время вынос реализации в отдельное место должен преследовать иные цели. Удобства при чтении это никак не добавляет.

Почему только в настоящее время?
...
Рейтинг: 0 / 0
указатель this
    #38098943
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПочему только в настоящее время?
Потому что, раньше приходилось читать код в текстовом режиме на 25 строк по вертикали без особых фнукциональных удобств редакторов.
...
Рейтинг: 0 / 0
указатель this
    #38099082
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonПотому что, раньше приходилось читать код в текстовом режиме на 25 строк по вертикали без особых фнукциональных удобств редакторов.П-ф-ф ... MultiEdit дохрена чего умел и встроенные редакторы Borland-овских сред, да и режим 132x50 - вчера появился.
...
Рейтинг: 0 / 0
указатель this
    #38099087
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovEdd.DragonПотому что, раньше приходилось читать код в текстовом режиме на 25 строк по вертикали без особых фнукциональных удобств редакторов.П-ф-ф ... MultiEdit дохрена чего умел и встроенные редакторы Borland-овских сред, да и режим 132x50 - вчера появился.Тише, не рушь легенды. Пусть верят что мы через copy con file.c программы писали.
...
Рейтинг: 0 / 0
указатель this
    #38099757
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovП-ф-ф ...
Ну да, сначала появились удобные средства редактирования и большие экраны, а уже после человечество перешло с ассемблера на Си. Точно, вспомнил.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель this
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]