Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/352: Рейтинг темы: голосов - 352, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 1
1

Что значит "->" в C++ ?

04.02.2016, 11:16. Показов 73051. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Объясните пожалуйста что это значит "->".
Пример:
C++
1
Memo_KS->Lines->Delete(Text.Pos("#"));
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2016, 11:16
Ответы с готовыми решениями:

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том...

Sleep(8000) - что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как...

Что значит public string T и все что дальше в приведенном коде?
class String { private string A; public String() { } ...

6 cores are activated что это значит и что с этим делать?
Доброго времени суток уважаемые форумчане. Возникла вот такая незадача с компом. Пишет 6 cores are...

28
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.02.2016, 19:23 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от quwy Посмотреть сообщение
Экземпляр класса в C# -- это тоже указатель
Вы сами понимаете, что пишете? Экземпляр класса - это, грубо говоря, кусок памяти в куче. Идентификатор, по которому можно обратиться к этому куску, называется в терминологии C# ссылкой. И не надо сравнивать C# и C++.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
05.02.2016, 02:15 22
Цитата Сообщение от quwy Посмотреть сообщение
нафига было придумывать еще один бессмысленный оператор?
Б. Керниган, Д. Ритчи "Язык программирования Си"
Унарный оператор * есть оператор косвенного доступа. Примененный к указателю, он выдает объект, на
который данный указатель указывает.
...
Доступ к отдельному элементу структуры осуществляется посредством конструкции вида:
имя-структуры.элемент
...
Скобки в (*рр).х необходимы, поскольку приоритет оператора . выше, чем приоритет *. Выражение
*рр.х будет проинтерпретировано как *(рр.х), что неверно, поскольку рр.х не является указателем.
Указатели на структуры используются весьма часто, поэтому для доступа к ее элементам была придумана еще
одна, более короткая форма записи. Если р — указатель на структуру, то
р -> элемент-структуры
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.02.2016, 10:31 23
Croessmah, ну формально, если отказаться от стрелки, а точку интерпретировать с учетом контекста, я не вижу особых проблем, даже не смотря на приведенную тобой цитату.
Допустим:
C++
1
2
3
struct S {
   int* i;
} *p;
Тогда, если убрать из языка -> получим следующие типы для выражений:
C++
1
2
3
4
p.i // int*
*p.i // int
*(p.i) // int
(*p).i // int*
Причем выражения в строках 1 и 4, 2 и 3 попарно эквивалентны. Т.о. версии со скобками становятся избыточными.
Заметь, приоритеты операций остались прежними.

Имхо, нужно какое-то другое объяснение необходимости -> в чистых сях.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
05.02.2016, 10:52 24
Цитата Сообщение от Tulosba Посмотреть сообщение
даже не смотря на приведенную тобой цитату.
Был вопрос зачем ввели.
Я привел фрагмент из книги
Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, нужно какое-то другое объяснение необходимости -> в чистых сях.
Кому нужно?
Мне, если честно, глубоко наплевать зачем.
Меня и так всё устраивает.
Не вижу причин разводить из этого беседу на мильён тыщ страниц.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.02.2016, 11:11 25
Цитата Сообщение от Croessmah Посмотреть сообщение
Был вопрос зачем ввели.
Я привел фрагмент из книги
Привёл - хорошо. Но он не отвечает на вопрос "зачем" при условии контекстной зависимости оператора точка.
Цитата Сообщение от Croessmah Посмотреть сообщение
Меня и так всё устраивает.
Рад за тебя. Но если тебе не интересно - просто не пиши.
S_el вон приводил пример кода на Go, где обошлись без ->, но там и перегрузки операторов нет.
Цитата Сообщение от Croessmah Посмотреть сообщение
Не вижу причин разводить из этого беседу на мильён тыщ страниц.
А что тут ещё делать? Это ж форум
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
05.02.2016, 11:41 26
Цитата Сообщение от Tulosba Посмотреть сообщение
S_el вон приводил пример кода на Go, где обошлись без ->, но там и перегрузки операторов нет.
А раньше люди на деревьях висели, а теперь вот в домиках живут.
Надеюсь, моя точка зрения понятна
В дальнейшей дискуссии не вижу смысла.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.02.2016, 11:50 27

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
А раньше люди на деревьях висели, а теперь вот в домиках живут.
То были ещё не люди :)


Цитата Сообщение от Croessmah Посмотреть сообщение
Надеюсь, моя точка зрения понятна
Ну, вот а моя точка зрения в том, что -> возник из-за нежелания делать . контекстно зависимой. В таком случае и цитата из K&R приобретает смысл.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.02.2016, 11:53 28
Лучший ответ Сообщение было отмечено Croessmah как решение

Решение

Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, нужно какое-то другое объяснение необходимости -> в чистых сях.
Полагаю, что могу его предоставить.

В одной из первых редакций языка Си, ныне существующей (емнип только в ней) в виде "C Reference Manual" Денниса Ритчи, существовала глобальная концепция смещений для структур. Под этим понималось дословно следующее: все наименования всех структурных членов имели конкретное значение и, как следствие, должны были быть уникальными. Также язык требовал, чтобы все наименования членов структур были или уникальными, или имели одно и то же смещение. В рамках одной единицы трансляции. Для примера рассмотрим структуру:
C
1
2
3
4
struct S {
  int a;
  int b;
};
В ней, наименование a имело смещение 0, а b смещение 2 (исходя из того, что нет вставочных блоков (padding -- не знаю точного соответствия на русском) и инт размером два байта). Язык допускал (с учетом вышесказанного) объявление структуры следующего вида (в том же модуле):
C
1
2
3
4
struct X {
  int a;
  int x;
};
поскольку наименование поля a также имеет смещение 0. Но нельзя было (в том же модуле) объявить такую структуру:
C
1
2
3
4
struct Y {
  int b;
  int a;
};
потому, что такое объявление бы трактовалось компилятором как попытка переопределить смещение наименование поля a с 0 на 2.

Это все подводит к сути.
Поскольку, как уже было сказано, каждый член структуры имел собственное "глобальное" значение, язык поддерживал такие действия:
C
1
2
int i = 5;
i->b = 14;
что по смыслу означало: взять адрес 5, добавить смещение 2, записать инт значение 14. И оператору стрелка было абсолютно все равно на выражение слева. Подобный трюк был невозможен в виде:
C
1
(*i).b = 14;
поскольку разыменование переменной i -- невалидная конструкция. Ну и оператор зведочка сам по себе более строгий.

Со временем, концепции были переработаны (по моему уже в КиР), а функциональность стала эквивалентной.

Как-то так.
7
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.02.2016, 12:22 29
Цитата Сообщение от HighPredator Посмотреть сообщение
C
1
2
int i = 5; 
i->b = 14;
Это, конечно, выглядит в современном мире как полнейшая дичь
Тем не менее, на основании упомянутого документа C Reference Manual действительно слева от -> могло стоять чуть ли ни всё что угодно:

7.1.8 primary-expression−>member-of-structure
The primary-expression is assumed to be a pointer which points to an object of the same form as the structure of
which the member-of-structure is a part. The result is an lvalue appropriately offset from the origin of the pointed-to
structure whose type is that of the named structure member. The type of the primary-expression need not in fact be
pointer; it is sufficient that it be a pointer, character, or integer.
2
05.02.2016, 12:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2016, 12:22
Помогаю со студенческими работами здесь

Написать что значит каждая строчка и за что она отвечает
Program ABC const n = 5; var a: array of integer; i, S, p: integer; begin s := 0;...

Что значит это условие? Немогу расчехлить на что тут идёт проверка!!!
НЕмогу понять на что идет проверка. if monthof(DateTimePicker1.date+33)<9 then...

Что значит исследовать сходимость метода (Якоби) и что за график нужно построить
Здравствуйте, вопрос в следуещем. В лабе по ЧМ нужно решить СЛАУ методом Якоби(что я сделал) и...

Объяснить что значит и что делает выделенное, а так же исправить код одной из задач
Объяснить что значит и что делает выделенное. Исправить код 2 задачи, чтоб правильно считал. 1....

Что значит boot device led? Что делать?
Купил материнку Asus Z97-A. Все подключил, но при в ключении на матери загорается диод boot device...

Что значит i в этой программе и что оно делает?
А что значит i в этой программе и что оно делает? clc,clear all...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru