0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
1

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

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

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

Начну с вопроса: чем отличается вызов объекта через "." и через "->"
И в каких случаях лучше применять тот или иной способ.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2009, 18:28
Ответы с готовыми решениями:

Чем отличается вставка в vector<string > через pushback и через индекс []?
Просто пробовал через индекс и получил ошибку out of range. То есть так : ifstream File; ...

Вызов объекта через строковую переменную
Excel. Есть книга с главным листом и множеством второстепенных. Задача: создать...

Чем поляризация света от естественного источника отличается от света, прошедшего через светофильтр
чем поляризация света от естественного источника отличается от света, прошедшего через светофильтр?

Чем отличается косвенный вызов процедуры от прямого вызова?
Помогите ответить на вопросы: 53. Чем отличается косвенный вызов процедуры от прямого вызова на...

Чем отличается вызов функции(sub) c параметром call от обычного вызова?
Чеи отличается вызов функции(sub) c параметром call от обычного вызова Example1: call...

24
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 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;
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
15.05.2009, 19:00 3
Kleyo,
а что, специализированная литература - это уже не модно?
0
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
15.05.2009, 19:35  [ТС] 4
Да нет я ж не случайно создал раздел "для чайников", для таких людей нужна специальная литература или объяснения простым языком.

У меня вопрос был не как объявлять и вызывать объект, а в чем разница этих подходов, и где какой из подходов должен применяться))))
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
15.05.2009, 19:58 5
Kleyo,
... в чем разница этих подходов ...
'.' используется для доступа к полям/методам объекта, либо ссылки на объект, '->' - для доступа по указателю на объект.

где какой из подходов должен применяться
зависит от ситуации.
например, можно передать в функцию либо указатель, либо ссылку, и то и другое позволит менять исходный объект, но указатель может быть и NULL, а ссылка - не может. и тому подобные нюансы, связанные с различиями между ссылкой и указателем.
0
2816 / 1407 / 107
Регистрация: 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();

две идентичные строчки...
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
15.05.2009, 20:09 7
две идентичные строчки...
только не с точки зрения C++
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.05.2009, 20:43 8
Rififi, для начала необходимо понять разницу в использовании... и что сподручней применить... а разницу с точки зрения C++ - он поймет потом, при более углубленном изучении.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.05.2009, 23:52 9
Если ты имеешь объект, то используется оператор ".", если указатель на объект - оператор "->". Больше никакой разницы нет.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 01:14 10
указатели на классы - важная штука, без них, часто бывает, никак не обойтись - области видимости, инициализация итп, так что -> рулит!
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 11:45 11
Цитата Сообщение от alex_x_x Посмотреть сообщение
указатели на классы - важная штука
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:05 12
Цитата Сообщение от Evg Посмотреть сообщение
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
как это указатель и экземпляр класса - разные вещи, экземпляр класса хранится в памяти, а указатель - переменная, хранящая его адрес, и имеющая тип указываемого объекта
ы?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 17:21 13
Ещё раз. Какая на разница, класс у нас, переменная типа double или чего-то там ещё. С этой точки зрения указатель на обычную переменную принципаильно ничем не отличается от указателя на экземпляр класса. Просто ты так восхвалил "указатеи на классы", как будто это нечто такое, без чего нельзя было бы жить

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

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

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

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

И если не так, то объясните толком разницу, и где нужно применять тот или иной способ и самое главное ПОЧЕМУ?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:42 15
Цитата Сообщение от Evg Посмотреть сообщение
Ещё раз. Какая на разница, класс у нас, переменная типа double
Имелось в виду, что вызвать метод класса или обратиться к полю класса можно хоть через первое хоть через второе
да, вы правы, просто просто приминение конструкции вида
C++
1
CButton* pButt=new CButton;
заставило забыть, что обращение по имени экземпляра - тоже операция с указателеm, но строго говоря методы работы с ними все-равно получаются разные (. и ->)
Kleyo, через точку как правило вызывают классы, созданные в статической памяти, через -> - динамические либо переданные как указатели, но Evg поселил сомнения насчет терминологии указателей на классы
0
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 17:46  [ТС] 16
Стоп еще раз.
Вопрос следующий, какие классы нужно создавать в статической памяти, а какие в динамической? Тогда это будет ответом на вопрос "Где надо применять ".", а где "->" ))))
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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 поселил сомнения насчет терминологии указателей на классы
А в чём конкретно сомнение? Я мог не так выразиться или ты мог не так понять. Если ты начинающий программист - не стесняйся задать вопрос. А то я ещё запутаю тебя своими словами
0
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 20:34  [ТС] 18
Цитата Сообщение от Evg Посмотреть сообщение

Экземпляр класса создавай где тебе удобно. Приниципально от этого ничто не меняется. Точку надо ставить тогда, когда ты имеешь переменную типа класс (т.е. экземпляр класса), стрелку надо ставить тогда, когда ты имеешь указаетль на класс (т.е. указатель на экземпляр класса). Точка и стрелка - это не более чем синтаксис языка
То есть на занимаемую память это абсолютно не влияет?
Получается, что принципиальной разницы не существует?
В таком случае я не понимаю, зачем есть два способа, а не один. Зачем тогда разработчикам языка вообще нужно было делать вызов через указатель?
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
16.05.2009, 20:38 19
чтобы вызвать с помощью оператора -> надо чтобы был указатель
а разница между A a= new A; и A a в том что в первом случае вызывается конструктор
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2009, 20:40 20
как зачем? что работать с объектами не зная их имени (имени переменной-лбъекта).
например: ты не знаешь кол-во требуемых тебе объектов (это кол-во расчитывается в процессе работы программы), затем ты выделяешь память под массив указателей (размером - сколько объектов тебе надо) и работаешь со всеми посредством этого массива
0
16.05.2009, 20:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2009, 20:40
Помогаю со студенческими работами здесь

Чем отличается экземпляр класса от объекта? Что такое экземпляр объекта?
Добрый день! Чем отличается экземпляр класса от объекта? Что такое экземпляр объекта? Вот...

Чем отличается вызов конструктора в объявлении поля, от вызова при создании экземпляра?
Грубо говоря, не могу сообразить, чем отличаются следующие два поля: public class MyClass { ...

Есть 2 ноута и 2 любых мобильника. Возможно ли соединить компы через мобильники, через голосовой вызов?
Есть 2 ноута и 2 мобильника. На одном ноуте интернет. Нужно через мобильники соединить их в сеть,...

Монитор через пк показывает лучше, чем монитор через ноутбук. В чём проблема?
Вопрос в заголовке Добавлено через 11 минут Картинка какая-то не приятная, не плавная. Смотреть...

Строка через указатель и через массив - в чем преимущества каждого подхода
Хотелось бы получить конкретный ответ на такой вопрос: в каком случае используется объявление...

В чем разница передачи значения через bundle или через navArgs?
Можно в bundle передать информацию и по ключу в другом фрагменте получить, а можно через...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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