Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2013, 19:16   #1
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию Указатели вместе с классами (class)

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



Нашёл в инете следующую программу:


Код:
2: // Доступ к данным объекта в области динамического обмена

3:

4: #include <iostream.h>

5:

6: class SimpleCat

7: {

8: public:

9: SimpleCat() { itsAge = 2; }

10: ~SimpleCat() { }

11: int GetAge() const { return itsAge; >

12: void SetAge(int age) { itsAge = age; }

13: private:

14: int itsAge;

15: };

16:

17: int main()

18: {

19: SimpleCat * Frisky = new SimpleCat;

20: cout << "Frisky " << Frisky->GetAge() << " years old ";

21: Frisky->SetAge(5);

22: cout << "Frisky " << Frisky->GetAge() << " years old ";

23: delete Frisky;

24: return 0;

25: }



Результат:

Frisky 2 years old

Frisky 5 years old


В этой программе я не нашёл ОБЪЕКТА. Насколько я помню объект в этом случае должен создаваться так:
Код:
SimpleCat Frisky;
Тоесть то слово которое идёт после имени класса является объектом. В коде такого нету. По моему Frisky является указателем на экземпляр класса SimpleCat, но это не объект.
Frisky по логике это ведь указатель на экземпляр класса SimpleCat. А где тогда объект с помощью которого можно обращаться к переменным класса? В этой программе откуда я привёл пример к переменным класса обращаются при помощи Frisky таким образом:
Код C++


Код:
Frisky->SetAge(5);
Значит выходит что объект- это слово Frisky. Но как это слово стало объектом непонятно.


Вот описание к коду которое было при нём:

Анализ: В строке 19 в области динамического обмена выделяется память для хранения экземпляра класса SimpleCat. Конструктор, вызываемый по умолчанию, присваивает новому объекту возраст два года. Это значение получено как результат выполнения функции-члена GetAge(), которая вызывается в строке 20. Поскольку мы имеем дело с указателем на объект, для вызова функции используется оператор косвенного обращения к члену класса (->). В строке 21 для установки нового значения возраста вызывается метод SetAge(), а повторный вызов функции GetAge() (строка 22) позволяет получить это значение.

Последний раз редактировалось koderman; 07.01.2013 в 19:47.
koderman вне форума Ответить с цитированием
Старый 07.01.2013, 19:21   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
По моему Frisky является указателем на экземпляр класса SimpleCat, но это не объект.
Значит выходит что объект- это слово Frisky. Но как это слово стало объектом непонятно.
объект - экземпляр класса.

Frisky; // указатель на объект

*Frisky // разыменовываем указатель, получаем объект

Цитата:
Frisky по логике это ведь указатель на экземпляр класса SimpleCat. А где тогда объект с помощью которого можно обращаться к переменным класса?
...
В этой программе откуда я привёл пример к переменным класса обращаются при помощи Frisky таким образом:
Frisky->SetAge(5);
попробуй
(*Frisky).SetAge(5);
rrrFer вне форума Ответить с цитированием
Старый 07.01.2013, 19:22   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

в чем вопрос-то?
rrrFer вне форума Ответить с цитированием
Старый 07.01.2013, 19:24   #4
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию

Это
Код:
(*Frisky).SetAge(5);
тоже самое что и это
Код:
Frisky->SetAge(5);
Вопрос был в том что я не мог найти объект и как его создают в этой программе.

Последний раз редактировалось koderman; 07.01.2013 в 19:40.
koderman вне форума Ответить с цитированием
Старый 07.01.2013, 19:26   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Это (*Frisky).SetAge(5); тоже самое что и это Frisky->SetAge(5);
да.

ЗЫ. пользуйся тегами CODE для выделения кода, будет красиво ) и номера строк руками ставить не надо
rrrFer вне форума Ответить с цитированием
Старый 07.01.2013, 19:27   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Вопрос был в том что я не мог найти объект и как его создают в этой программе.
конструктором он создается, всегда (не только в этой программе)
rrrFer вне форума Ответить с цитированием
Старый 07.01.2013, 19:30   #7
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию

Кароче здесь создаётся одновременно и указатель на класс SimpleCat и объект?
Код:
SimpleCat * Frisky = new SimpleCat;
В одном имени у нас получается и объект и указатель?
Frisky;- указатель на объект
*Frisky - объект


Ага, вот это выражение
Код:
(*Frisky).SetAge(5);
лучше показывает что *Frisky является объектом.
Сейчас стало понятней. Вы умеете объяснять))

Последний раз редактировалось koderman; 07.01.2013 в 19:40.
koderman вне форума Ответить с цитированием
Старый 07.01.2013, 20:02   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
В одном имени у нас получается и объект и указатель?
не умею я объяснять, если я выше не писал "указатель на объект".

Если у вас есть:
SimpleCat obj;
вы же не говорите что в имени obj у вас есть указатель, но можно ведь записать:
SimpleCat *pointer = &obj;

В голове у вас ужасная каша.
rrrFer вне форума Ответить с цитированием
Старый 07.01.2013, 20:29   #9
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Если у вас есть:
SimpleCat obj;
вы же не говорите что в имени obj у вас есть указатель
Не говорю. Потомучто перед obj нету звёздочки (*)
Какраз в этом примере видно что создаётся только объект класса SimpleCat.
koderman вне форума Ответить с цитированием
Старый 11.01.2013, 15:07   #10
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Я думаю здесь пытаются донести что сам объект создается. Но он создается динамически и он создается в так называемой куче. Но обращение к этому объекту идет через ссылку. Вот и вся разница между:

class object и class *object = new class;
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вместе пишем XMLParser class Smitt&Wesson C++ Builder 2 29.04.2011 20:57
Загрузить библиотеку вместе сразу вместе с программой Anekdot Общие вопросы Delphi 4 26.01.2010 23:14
помогите template<class> (Шаблоны и указатели) breate Общие вопросы C/C++ 3 23.10.2009 23:17
Вопрос с классами. Вадим Буренков Общие вопросы Delphi 11 13.07.2009 10:57
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39