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

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

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

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

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

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

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

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

Чем отличается "\n" от std::endl? - C++
чем они отличаются?

произведение через "одиного" между min и max, и через 1 цикл - C++
пацаны нужна ваша помощь..<censored> это программирование уже..времени мало совсем..помогите с такой <censored>.. задание.вычислить...

Дано натуральное число. Верно ли, что цифра "a" встречается в нем реже, чем цифра "b"? - C++
Дано натуральное число. Верно ли, что цифра a встречается в нем реже, чем цифра b. Заранее спасибо

Проверить, встрачается ли в заданном тексте буква "а" чаще, чем буква "b" - C++
задача: Напечатать true, если в заданном тексте буква "а" встречается чаще чем буква "b", и напечатать false в противном случае. Помогите...

Класс: Реализация через битовое поле класса "Множество" - C++
Реализация через битовое поле. Как сделать ввод и вывод множества и так чтобы элементы хранились в отсортированном порядке? #include...

Код ошибки при вызове функции через "system" - C++
Операционная система типа Unix. Вызываю команду mount через system: system("mount /mnt/floppy"). В случае ошибки, результат system...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kleyo
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 11
16.05.2009, 17:46  [ТС]     чем отличается вызов объекта через "." и через "->" #16
Стоп еще раз.
Вопрос следующий, какие классы нужно создавать в статической памяти, а какие в динамической? Тогда это будет ответом на вопрос "Где надо применять ".", а где "->" ))))
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 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
680 / 229 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
16.05.2009, 20:38     чем отличается вызов объекта через "." и через "->" #19
чтобы вызвать с помощью оператора -> надо чтобы был указатель
а разница между A a= new A; и A a в том что в первом случае вызывается конструктор
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2009, 20:40     чем отличается вызов объекта через "." и через "->" #20
как зачем? что работать с объектами не зная их имени (имени переменной-лбъекта).
например: ты не знаешь кол-во требуемых тебе объектов (это кол-во расчитывается в процессе работы программы), затем ты выделяешь память под массив указателей (размером - сколько объектов тебе надо) и работаешь со всеми посредством этого массива
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.05.2009, 20:41     чем отличается вызов объекта через "." и через "->" #21
разница между A a= new A; и A a в том что в первом случае вызывается конструктор
БСК
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2009, 20:42     чем отличается вызов объекта через "." и через "->" #22
Цитата Сообщение от Mecid Посмотреть сообщение
разница между A a= new A; и A a в том что в первом случае вызывается конструктор
конструктор в любом случае вызыввается.. хоть так, хоть так:

C++
1
2
A a;
A *a = new A;
Mecid
680 / 229 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
16.05.2009, 21:34     чем отличается вызов объекта через "." и через "->" #23
понял ошибку...поспешные выводы....
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 26
16.05.2009, 23:01     чем отличается вызов объекта через "." и через "->" #24
Цитата Сообщение от Kleyo Посмотреть сообщение
В таком случае я не понимаю, зачем есть два способа, а не один. Зачем тогда разработчикам языка вообще нужно было делать вызов через указатель?
Просто в одном случае обращение идёт через объект, а в другом через указатель. Первоначальное назначение точки и стрелки (из языка Си) - это доступ к ПОЛЯМ структоры. Методы появились только в Си++ и для обращения к методам были использованы те же конструкции.

Из две, потому что в одном случае ты обращаешься через объект, а в другом - через указатель. Т.е. на уровне кода это две разные операции, но на уровне записи текста программы можно было бы сделать и одну (как с квадратными скобками)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2009, 00:03     чем отличается вызов объекта через "." и через "->"
Еще ссылки по теме:

Передача консольных команд в CMD через system(""); - C++
Всем привет! Подскажите как выполнять консольные команды через system с правами администратора? На пример: int main(void) { ...

Как обмануть компилятор и "перепрыгнуть через функцию"? - C++
Известно, что адрес возврата из функции сохраняется на стеке. (В данном эксперименте мы отключим все виды инлайна в оптимизациях). Так...

Написание програмы по теме "строки" через функцию - C++
Нужно вывести строку символов. Определить количество одинаковых двухбуквенных сочетаний. Вывести на экран результат паботы. Применить это...

Через каждые 5 символов добавить пробел и посчитать количество символа "X" - C++
Дан массив символов из 20 элементов. Через каждые 5 символов добавить пробел и посчитать количество символа "X" в массиве. Помогите...

Как открывать файлы-ЕХЕ для С++ через "декомпилятор JetBrains dotPeek .1.5"? - C++
Здравствуйте! Научите, пожалуйста, открывать файлы-ЕХЕ для С++ через "декомпилятор JetBrains dotPeek .1.5". Сам пока не открывал,...


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2009, 00:03     чем отличается вызов объекта через "." и через "->" #25
Kleyo
C++
1
2
3
4
classA a;
classA*pa=&a;
pa->go();
(*pa).go();
те стрелка в-принципи ради удобства
Yandex
Объявления
17.05.2009, 00:03     чем отличается вызов объекта через "." и через "->"
Ответ Создать тему
Опции темы

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