198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||
1 | ||||||
указатель this что именно он делает25.05.2013, 15:32. Показов 3746. Ответов 28
Метки нет (Все метки)
Вот код:
Кликните здесь для просмотра всего текста
Много прочитал про оператор this, но все же осталось смутное представление о нем, думаю на практике, на примере, удастся понять до конца, подскажите, в строчке 7 часть кода: return *this куда именно и что именно возвращает оператор return ? Правильно ли я понимаю, что return *this возвращает новое значение двух переменных (varOne и varTwo), по тому адресу, по которому они находятся? в объекте qwerty? т.е. сначала они ( переменные varOne и varTwo) были 0 и 10, и находились по адресам, допустим varOne - 00001, varTwo - 00002, после выполнения операции инкремента, в эти адреса (00001 и 00002) return *this возвращает новые значения, 1 и 11?
0
|
25.05.2013, 15:32 | |
Ответы с готовыми решениями:
28
обьясните что именно делает функция this Объясните что именно делает функция даном коде Объясните что именно делает "x%d, y%d: " или что это в даном коде объясните что именно делает функция |
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
25.05.2013, 15:47 | 2 |
this - не оператор, а указатель. Хранит адрес объекта, метод которого вызван.
* - оператор разыменования указателя, т.е. получения значения, на которое он указывает. В данном случае в this находится адрес объекта qwerty. Смотрим на объявление метода: Следовательно, оператор ++ вернет новый объект типа test_class. Добавлено через 59 секунд Ведь в 8 и 9 строках оператор return почему-то не вызывает вопросов?
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||
25.05.2013, 16:04 [ТС] | 3 | |||||
Блин, только вчера нашел 2 темы на этом форуме, в обоих писалось что это не оператор, и я все равно на косячил в тексте, ну я имел ввиду указатель.
Да, не вызывает, там всё куда проще, есть переменная, оператор return возвращает эту переменную, тут надо быть очень тугим, что бы этого не понимать, а вот что значит return *this что за *this, я все таки до конца не понимаю это для меня тоже самое что:
Меня надо удалить с форума? за что? за то, что я подрываю его своей бездарностью? А как понять новый, что за новый? Речь идет о том, что при манипуляциях с объектом класса test_class в данном случае это qwerty будет создана его копия и именно этой копию он вернет, включая новые значения переменных? или как?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
25.05.2013, 16:13 | 4 |
Там был пост, который автор посчитал нужным удалить.
На самом деле, я предлагаю на секунду отойти от конкретно оператора инкремента, ибо в данном случае это еще больше запутает. Давайте напишем просто метод и назовем его inc, чтобы не огрести лишних забот.
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
25.05.2013, 16:15 [ТС] | 5 |
ладно, сейчас напишу другую программу, которая будет просто прибавлять 5, надеюсь об этом идет речь.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||||||||||
25.05.2013, 16:32 | 6 | ||||||||||
Вот этот код понятен?
Добавлено через 13 минут В следующем приближении разыменование может происходить в функции:
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
25.05.2013, 16:33 [ТС] | 7 |
Строка 3 - объявляется и инициализируется переменная n
Строка 4 - создается указатель *pn и адрес куда ведет этот указатель такой же как и у перемененной n, а точнее оба эти значения (10) находятся по одному адресу. Строка 5 - объявляется новая переменная m и она инициализируется, ей присваивается значение указателя *pn т.е. 10, при этом она имеет свой адрес в памяти (отдельный от n / *pn)
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
25.05.2013, 16:42 | 9 |
Ну т.е. есть понимание, что в данном случае имеем два разных объекта. Т.е. в m копируется значение ячейки, на которую указывает pn. Ниже написал еще функцию - там происходит то же самое. С return *this - аналогично.
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||
25.05.2013, 16:50 [ТС] | 10 | |||||
И если мы находясь в функции изменим значение *p допустим на 20, то значение переменной n тоже изменится на 20.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
25.05.2013, 17:00 | 11 | |||||
Он на то и указатель, чтобы хранить не значение а только адрес. Не более того.
Добавлено через 1 минуту Вроде особых затруднений не наблюдаю. Или остались еще вопросы? Добавлено через 5 минут Ну докину еще код для размышлений
2
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
|
25.05.2013, 17:08 [ТС] | 12 |
Мне надо некоторое время что бы переварить
Я напишу тогда попозже. Добавлено через 7 минут И надо кодом как раз подумаю
0
|
Комп_Оратор)
|
||||||||||||||||
25.05.2013, 18:15 | 13 | |||||||||||||||
VLK, перегрузка оператора инкремента - не самый удачный пример для понимания, что такое this.
this это указатель на экземпляр класса (переменную типа определяемого классом) для которого вызывается функция класса (не дружественный и не статический метод определённый в классе). Что касается оператора ++, то у Вас не определён тип возврата. Для префиксного:
1
|
25.05.2013, 18:37 | 14 |
На всякий случай подкину ссылок. Там сумбур, но может что-то полезное сумеешь понять:
После компиляции VS2008 падает после удаления узла дерева, имеющего потомка После компиляции VS2008 падает после удаления узла дерева, имеющего потомка чем отличается вызов объекта через "." и через "->"
2
|
Комп_Оратор)
|
|
25.05.2013, 19:27 | 15 |
Evg, хорошие ссылки, спасибо. Последнюю время от времени перечитываю. Речь в них идёт о доступе к членам через класс или его экземпляр. В последней теме не прозвучало, что создатель языка пытался предоставить альтернативу с-шному синтаксису даже для объявлений указателя, чтобы избежать интерпретации изнутри вправо а потом влево:
int *a;// * - указатель а, - имя, int - указывающий на int вроде такого: a -> int; не поручусь за точность, но как-то так. То есть a это указатель на int. Второй идеей была мысль избежать разноупотребления * в объявлениях и в разыменовании. При этом для совместимости, старый синтаксис оставался в силе. Этой идее не суждено было сбыться и возможно к лучшему. Но как оператор доступа стрелка прижилась. Конечно это для самодокументируемости (понятности) языка. Чтобы различать доступ через экземпляр и через указатель при чтении. В этом топике, вопрос если я понял о скрытом указателе для функций членов. Он передается как скрытый аргумент и подставляется для имен членов внутри: myField this->myField myFoo() this->myFoo а для операторов (бинарных) укзателем является указатель на вызывающий не через оператор доступа "." или "->", а по расположению слева. Если справа нужно, то там через друзей и значит явно через аргументы.
0
|
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
|
||||||
26.05.2013, 00:06 [ТС] | 16 | |||||
Строчки 3-7 объявляется класс test, у него одна открытая переменная "v". в Строчке 18 объявляется объект "a" класса "test", и переменной "v" присваивается значение 10. в Строчке 21 объявляется еще один объект "b" класса "test", и ему присваивается значение которое рассчитывается в функции строчки 9-14 В строчке 9 объявляется функция "inc" типа "test", с параметрами, 1. параметр это ссылка на объект "a" класса "test", второй целочисленное число. В строке 11 объявляется объект "rv" класса "test", все его параметры равны параметрам this_, а в свою очередь его параметры равны объекту "a" класса "test", this_ это ссылка на объект "a", Но объект "rv" имеют свой адрес в области памяти, отличный от "a", а "test* const this_" и "a" имеют один адрес в области памяти. В строке 12 к "v" через указатель прибавляется "inc_value", но эта "v" имеет отношение к "test* const this_" из строчки 9, а не к объекту "rv" т.е. 12 строчка поменяла значение "a.v" на 11 При это "b.v" остается 10 т.к. он имеет разный адрес в памяти от "a.v" и "test* const this_" Все правильно? и еще вопрос насчет строчки 13, на сколько мне известно оператор return возвращает только значение, число или лог. значение, а тут получается объект класса, я может не в полном объеме понимаю Я представляю так? вернуть можно значение, например: int x=10; return x; а тут, для меня это равнозначно: return funciya(); или return int x; но так же не может быть, где ошибка в моей логике?
0
|
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
26.05.2013, 00:20 | 17 |
b остался таким потому, что вы ему присвоили старое значение a, которое вернулось из функции, где вы его вначале скопировали через переданный указатель в локальную переменную.
Всё правильно. Функции возвращают значения. Объекты класса тоже могут быть значениями. Главное свойство значений: их можно копировать (иногда ещё присваивать можно). Поэтому у объектов-значений должен быть конструктор копирования, чтобы они вели себя как значения. В том числе чтобы они возвращались из функций. Конструктор копирования обязательно существует у каждого класса; если не явно написанный вами, то сгенерированный компилятором автоматически (однако его использование может быть запрещено или ограничено). Автоматически сгенерированный тупо копирует все поля из одного объекта в другой. Кроме того, иногда функции должны не возвращать копию объекта, а создать объект где-то вне функции. В Си++ для этого ввели специальную приблуду rvalue, а до этого перебивались out-параметрами, оптимизациями компилятора или писали объекты (или обёртки) так, чтобы не было разницы между копированием и перемещением объекта.
0
|
Комп_Оратор)
|
||||||
26.05.2013, 00:37 | 18 | |||||
VLK, то что делает функция inc лучше сделать по-другому. Перегрузите постфиксный оператор operator++()
тогда:
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
26.05.2013, 07:50 | 19 |
IGPIGP, я специально ушел от оператора к функции, чтобы не заморачиваться с префиксной и постфиксной формами и не запутывать еще и ссылками. (Да, выше верно было сказано, что пример инкремента далеко не самый удачный)
Добавлено через 9 минут Функция inc, которая возвращает объект типа test. Сигнатура функции состоит из двух параметров: константный указатель на объект класса test и целое со знаком. this_ и a расположены по разным адресам. При этом в указателе this содержится адрес объекта 'a'.
2
|
Комп_Оратор)
|
|
26.05.2013, 10:49 | 20 |
0x10, совершенно согласен. Я разлил воду именно поэтому. В исходном примере [TC] не указал тип возврата, для оператора и это говорит, что вопрос как возвращается разименованный указатель, - за скобками. Но без этого пример ещё более неудачен, даже не учитывая, что инкремент это оператор-выражение, сочетающее lvalue, rvalue и присваивание. Ну то есть очень неудачный пример для понимания this.
Добавлено через 7 минут неправильная конструкция, не прижилась, а осталась!( Она была в С-структурах при доступе через указатель.) Не по теме: перечитываю написанное и удивляюсь :swoon:
0
|
26.05.2013, 10:49 | |
26.05.2013, 10:49 | |
Помогаю со студенческими работами здесь
20
Прокомментируйте отрывок кода, что именно он делает Как именно в методах расширения указать, что переходить нужно именно главный контроллер? Инициализация делает указатель из целого числа Нюансы синтаксиса: что означает указатель на указатель? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |