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

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

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

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

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

Иерархия классов "список"-"очередь", вызов метода через класс интерфейс
Есть небольшая иерархия классов, контейнер (список) для хранения объектов...

Чем отличается вызов функции setlocale(0, "") от setlocale(LC_ALL,"")?
Например printf(setlocale(0, "")); cout << endl; printf(setlocale(LC_ALL,...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить...

Через ООП: Дать для числа наименование: "рубль", "рубля", "рублей";
Помогите пожалуйста с задачей. Могу сделать ее просто, но надо через ООП и у...

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout
Добрый день! Переписал код из книг Лафоре, создание мультимножества из...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

24
oxotnik
1607 / 1084 / 69
Регистрация: 21.08.2008
Сообщений: 4,562
Записей в блоге: 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
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 19:00 #3
Kleyo,
а что, специализированная литература - это уже не модно?
0
Kleyo
0 / 0 / 1
Регистрация: 10.05.2009
Сообщений: 11
15.05.2009, 19:35  [ТС] #4
Да нет я ж не случайно создал раздел "для чайников", для таких людей нужна специальная литература или объяснения простым языком.

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

где какой из подходов должен применяться
зависит от ситуации.
например, можно передать в функцию либо указатель, либо ссылку, и то и другое позволит менять исходный объект, но указатель может быть и NULL, а ссылка - не может. и тому подобные нюансы, связанные с различиями между ссылкой и указателем.
0
Monte-Cristo
2794 / 1380 / 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
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 20:09 #7
две идентичные строчки...
только не с точки зрения C++
0
Monte-Cristo
2794 / 1380 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.05.2009, 20:43 #8
Rififi, для начала необходимо понять разницу в использовании... и что сподручней применить... а разницу с точки зрения C++ - он поймет потом, при более углубленном изучении.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,436
Записей в блоге: 30
15.05.2009, 23:52 #9
Если ты имеешь объект, то используется оператор ".", если указатель на объект - оператор "->". Больше никакой разницы нет.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 01:14 #10
указатели на классы - важная штука, без них, часто бывает, никак не обойтись - области видимости, инициализация итп, так что -> рулит!
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,436
Записей в блоге: 30
16.05.2009, 11:45 #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
указатели на классы - важная штука
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:05 #12
Цитата Сообщение от Evg Посмотреть сообщение
Класс - это такой же тип, как и всё остальное. И указатель на int по своей сути ничем не отличается от указателя на класс. Иметь объект типа класс или указатель на объект типа класс - разницы никакой
как это указатель и экземпляр класса - разные вещи, экземпляр класса хранится в памяти, а указатель - переменная, хранящая его адрес, и имеющая тип указываемого объекта
ы?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,436
Записей в блоге: 30
16.05.2009, 17:21 #13
Ещё раз. Какая на разница, класс у нас, переменная типа double или чего-то там ещё. С этой точки зрения указатель на обычную переменную принципаильно ничем не отличается от указателя на экземпляр класса. Просто ты так восхвалил "указатеи на классы", как будто это нечто такое, без чего нельзя было бы жить

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

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

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

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

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

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

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
#include <iostream> #include <fstream> #include <cstdlib> #include <time.h>...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс"
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания"
Создать класс Книга поля: название книги,количество страниц,год издания...


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

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

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