Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
#1

чем отличается вызов объекта через "." и через "->" - C++

15.05.2009, 18:28. Просмотров 2719. Ответов 24
Метки нет (Все метки)

Здравствуйте.
Вот создал топик для тех, кто желает сам познать С++, но у которых есть вопросы по базовым знаниям.

Начну с вопроса: чем отличается вызов объекта через "." и через "->"
И в каких случаях лучше применять тот или иной способ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2009, 18:28     чем отличается вызов объекта через "." и через "->"
Посмотрите здесь:

Код ошибки при вызове функции через "system" C++
Передача консольных команд в CMD через system(""); C++
C++ произведение через "одиного" между min и max, и через 1 цикл
Как обмануть компилятор и "перепрыгнуть через функцию"? C++
"Взлом" своей программы через артманию C++
Программа "калькулятор" через процедурное программирование C++
Через каждые 5 символов добавить пробел и посчитать количество символа "X" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.05.2009, 18:33     чем отличается вызов объекта через "." и через "->" #2
C++
1
2
CSomeObject SomeObject;
SomeObject.SomeMethod();
C++
1
2
3
CSomeObject *SomeObject = new CSomeObject();
SomeObject->SomeMethod();
delete SomeObject;
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 19:00     чем отличается вызов объекта через "." и через "->" #3
Kleyo,
а что, специализированная литература - это уже не модно?
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
15.05.2009, 19:35  [ТС]     чем отличается вызов объекта через "." и через "->" #4
Да нет я ж не случайно создал раздел "для чайников", для таких людей нужна специальная литература или объяснения простым языком.

У меня вопрос был не как объявлять и вызывать объект, а в чем разница этих подходов, и где какой из подходов должен применяться))))
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 19:58     чем отличается вызов объекта через "." и через "->" #5
Kleyo,
... в чем разница этих подходов ...
'.' используется для доступа к полям/методам объекта, либо ссылки на объект, '->' - для доступа по указателю на объект.

где какой из подходов должен применяться
зависит от ситуации.
например, можно передать в функцию либо указатель, либо ссылку, и то и другое позволит менять исходный объект, но указатель может быть и NULL, а ссылка - не может. и тому подобные нюансы, связанные с различиями между ссылкой и указателем.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.05.2009, 20:05     чем отличается вызов объекта через "." и через "->" #6
фактически, операция -> производить разименование....
т.е. возможен код:

C++
1
2
3
4
CSomeObject *SomeObject = new CSomeObject();
(*SomeObject).SomeMethod();
SomeObject->SomeMethod();
delete SomeObject;
то есть
(*SomeObject).SomeMethod();
SomeObject->SomeMethod();

две идентичные строчки...
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 20:09     чем отличается вызов объекта через "." и через "->" #7
две идентичные строчки...
только не с точки зрения C++
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.05.2009, 20:43     чем отличается вызов объекта через "." и через "->" #8
Rififi, для начала необходимо понять разницу в использовании... и что сподручней применить... а разницу с точки зрения C++ - он поймет потом, при более углубленном изучении.
Evg
Эксперт CАвтор FAQ
17393 / 5631 / 352
Регистрация: 30.03.2009
Сообщений: 15,417
Записей в блоге: 26
15.05.2009, 23:52     чем отличается вызов объекта через "." и через "->" #9
Если ты имеешь объект, то используется оператор ".", если указатель на объект - оператор "->". Больше никакой разницы нет.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 01:14     чем отличается вызов объекта через "." и через "->" #10
указатели на классы - важная штука, без них, часто бывает, никак не обойтись - области видимости, инициализация итп, так что -> рулит!
Evg
Эксперт CАвтор FAQ
17393 / 5631 / 352
Регистрация: 30.03.2009
Сообщений: 15,417
Записей в блоге: 26
16.05.2009, 11:45     чем отличается вызов объекта через "." и через "->" #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
указатели на классы - важная штука
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:05     чем отличается вызов объекта через "." и через "->" #12
Цитата Сообщение от Evg Посмотреть сообщение
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
как это указатель и экземпляр класса - разные вещи, экземпляр класса хранится в памяти, а указатель - переменная, хранящая его адрес, и имеющая тип указываемого объекта
ы?
Evg
Эксперт CАвтор FAQ
17393 / 5631 / 352
Регистрация: 30.03.2009
Сообщений: 15,417
Записей в блоге: 26
16.05.2009, 17:21     чем отличается вызов объекта через "." и через "->" #13
Ещё раз. Какая на разница, класс у нас, переменная типа double или чего-то там ещё. С этой точки зрения указатель на обычную переменную принципаильно ничем не отличается от указателя на экземпляр класса. Просто ты так восхвалил "указатеи на классы", как будто это нечто такое, без чего нельзя было бы жить

> Иметь объект типа класс или указатель на объект типа класс - разницы никакой

Имелось в виду, что вызвать метод класса или обратиться к полю класса можно хоть через первое хоть через второе
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 17:23  [ТС]     чем отличается вызов объекта через "." и через "->" #14
Стоп! Вот, прозвучало:

Цитата Сообщение от alex_x_x Посмотреть сообщение
как это указатель и экземпляр класса - разные вещи, экземпляр класса хранится в памяти, а указатель - переменная, хранящая его адрес, и имеющая тип указываемого объекта
ы?
Я тоже слышал, что разница в этом.
Так вот, в чем разница двух этих вызовов?

На сколько я понял, когда вызываешь через точку, то грубо говоря плодишь в памяти несколько экземпляров одного и того же класса, а если чере стрелочку, то обращение идет уже к загруженному экземпляру в памяти.
Так ли это?

И если не так, то объясните толком разницу, и где нужно применять тот или иной способ и самое главное ПОЧЕМУ?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:42     чем отличается вызов объекта через "." и через "->" #15
Цитата Сообщение от Evg Посмотреть сообщение
Ещё раз. Какая на разница, класс у нас, переменная типа double
Имелось в виду, что вызвать метод класса или обратиться к полю класса можно хоть через первое хоть через второе
да, вы правы, просто просто приминение конструкции вида
C++
1
CButton* pButt=new CButton;
заставило забыть, что обращение по имени экземпляра - тоже операция с указателеm, но строго говоря методы работы с ними все-равно получаются разные (. и ->)
Kleyo, через точку как правило вызывают классы, созданные в статической памяти, через -> - динамические либо переданные как указатели, но Evg поселил сомнения насчет терминологии указателей на классы
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 17:46  [ТС]     чем отличается вызов объекта через "." и через "->" #16
Стоп еще раз.
Вопрос следующий, какие классы нужно создавать в статической памяти, а какие в динамической? Тогда это будет ответом на вопрос "Где надо применять ".", а где "->" ))))
Evg
Эксперт CАвтор FAQ
17393 / 5631 / 352
Регистрация: 30.03.2009
Сообщений: 15,417
Записей в блоге: 26
16.05.2009, 18:37     чем отличается вызов объекта через "." и через "->" #17
Kleyo, ты создаёшь не классы, а экземпляры класса. Если ты вызваешь метод, то у тебя ничто нового не создаётся. Экземпляр класса или указатель на экземпляр - это всего лишь штука, от которой берётся класс, для того, чтобы понять, какую функцию вызывать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class C
{
  void func (coid);
};
 
class D
{
  void func (coid);
};
 
void main (void)
{
  C c; // экземпляр класса
  C *p = new C; // указатель на экземпляр класса
 
  // Две операции делают одно и то же - вызывают метод C::func
  // Экземпляр класса или указатель класса нужны в данном случае для того, чтобы
  // понять, что вызывается метод func класса C (а не класса D).
  // Плюс неявно передаётся параметр this (последнее относится к отличию
  // между c.func() и d.func()
  c.func();
  p->func();
}
Экземпляр класса создавай где тебе удобно. Приниципально от этого ничто не меняется. Точку надо ставить тогда, когда ты имеешь переменную типа класс (т.е. экземпляр класса), стрелку надо ставить тогда, когда ты имеешь указаетль на класс (т.е. указатель на экземпляр класса). Точка и стрелка - это не более чем синтаксис языка

Цитата Сообщение от alex_x_x Посмотреть сообщение
Evg поселил сомнения насчет терминологии указателей на классы
А в чём конкретно сомнение? Я мог не так выразиться или ты мог не так понять. Если ты начинающий программист - не стесняйся задать вопрос. А то я ещё запутаю тебя своими словами
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 20:34  [ТС]     чем отличается вызов объекта через "." и через "->" #18
Цитата Сообщение от Evg Посмотреть сообщение

Экземпляр класса создавай где тебе удобно. Приниципально от этого ничто не меняется. Точку надо ставить тогда, когда ты имеешь переменную типа класс (т.е. экземпляр класса), стрелку надо ставить тогда, когда ты имеешь указаетль на класс (т.е. указатель на экземпляр класса). Точка и стрелка - это не более чем синтаксис языка
То есть на занимаемую память это абсолютно не влияет?
Получается, что принципиальной разницы не существует?
В таком случае я не понимаю, зачем есть два способа, а не один. Зачем тогда разработчикам языка вообще нужно было делать вызов через указатель?
Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
16.05.2009, 20:38     чем отличается вызов объекта через "." и через "->" #19
чтобы вызвать с помощью оператора -> надо чтобы был указатель
а разница между A a= new A; и A a в том что в первом случае вызывается конструктор
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2009, 20:40     чем отличается вызов объекта через "." и через "->"
Еще ссылки по теме:

C++ Проверить, встрачается ли в заданном тексте буква "а" чаще, чем буква "b"
Чем отличается вызов функции setlocale(0, "") от setlocale(LC_ALL,"")? C++
C++ Как открывать файлы-ЕХЕ для С++ через "декомпилятор JetBrains dotPeek .1.5"?
C++ Чем отличается "\n" от std::endl?
C++ Написание програмы по теме "строки" через функцию

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2009, 20:40     чем отличается вызов объекта через "." и через "->" #20
как зачем? что работать с объектами не зная их имени (имени переменной-лбъекта).
например: ты не знаешь кол-во требуемых тебе объектов (это кол-во расчитывается в процессе работы программы), затем ты выделяешь память под массив указателей (размером - сколько объектов тебе надо) и работаешь со всеми посредством этого массива
Yandex
Объявления
16.05.2009, 20:40     чем отличается вызов объекта через "." и через "->"
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru