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

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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
oxotnik
1590 / 1067 / 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;
0
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
15.05.2009, 19:00 #3
Kleyo,
а что, специализированная литература - это уже не модно?
0
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
15.05.2009, 19:35  [ТС] #4
Да нет я ж не случайно создал раздел "для чайников", для таких людей нужна специальная литература или объяснения простым языком.

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

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

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

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

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

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

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

И если не так, то объясните толком разницу, и где нужно применять тот или иной способ и самое главное ПОЧЕМУ?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.05.2009, 17:42 #15
Цитата Сообщение от Evg Посмотреть сообщение
Ещё раз. Какая на разница, класс у нас, переменная типа double
Имелось в виду, что вызвать метод класса или обратиться к полю класса можно хоть через первое хоть через второе
да, вы правы, просто просто приминение конструкции вида
C++
1
CButton* pButt=new CButton;
заставило забыть, что обращение по имени экземпляра - тоже операция с указателеm, но строго говоря методы работы с ними все-равно получаются разные (. и ->)
Kleyo, через точку как правило вызывают классы, созданные в статической памяти, через -> - динамические либо переданные как указатели, но Evg поселил сомнения насчет терминологии указателей на классы
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2009, 17:42
Привет! Вот еще темы с ответами:

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

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

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

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.05.2009, 17:42
Ответ Создать тему
Опции темы

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