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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2017, 16:46   #1
Player150
Пользователь
 
Регистрация: 21.07.2017
Сообщений: 12
По умолчанию Какое значение имеет объект класса и т.д.?

здравствуйте, я начал недавно учить программирование, меня немного мучает один вопрос. предположим есть какой-то определенный класс, в main() имеется определение экземпляра класса, например:

Код:
int main() {

   myClass a;
   a.getSize();

   myClass& ref = a;
   ref.getSize();

   return 0;
}
какое конкретно значение и адрес имеет a в первой инструкции?

вот например когда имеется определение int ix = 0; понятно что ix конкретно идентифицирует ячейку со своим адресом и значением.

может быть под капотом в данной инструкции передается управление конструктору по-умолчанию и тогда данный объект будет иметь все свойства конструктора?
а во второй инструкции все свойства функции getSize()?
кстати, что происходит в четвертой инструкции?
почему, когда я использовал & с операндом в виде имени a, я получил адрес первого члена данных в private?

надеюсь понятно спросил, просто мне это важно знать, как это все работает. где об этом можно почитать? спасибо

______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 05.08.2017 в 16:57.
Player150 вне форума Ответить с цитированием
Старый 05.08.2017, 16:57   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Непонятный вопрос.

Что такое "свойства функции"?

myClass& это ссылка на экземпляр.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 05.08.2017 в 17:01.
Alex11223 вне форума Ответить с цитированием
Старый 05.08.2017, 17:55   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

"какое конкретно значение и адрес имеет a в первой инструкции?"

Если у вас в классе не прописан конструктор, то конструктором по умолчанию объект "а" будет размещен хрен знает по какому адресу и хрен знает с каким значением, и будет дожидаться вашей инициализации.

"вот например когда имеется определение int ix = 0; понятно что ix конкретно идентифицирует ячейку со своим адресом и значением."

В этом случае вы тоже не назначаете ячейку, не выявляете её (нужны определённые операторы), вы инициализируете переменную ix значением 0, опять таки хрен знает по какому адресу.

a.getSize();

Тут надо понимать что делает функция getSize(), каково её тело.

myClass& ref = a;
ref.getSize();

судя по второй строке, в первой происходит создание объект ref, а во второй он вызывает функцию getSize()
Но зачем ссылка?
Тем более объекту может быть равен как я понимаю только такой же объект. А для этого столько наворотить надо с перегрузкой "="....

почему, когда я использовал & с операндом в виде имени a, я получил адрес первого члена данных в private?

Вы бы класс myClass показали...
KAMLS вне форума Ответить с цитированием
Старый 05.08.2017, 18:13   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Если у вас в классе не прописан конструктор, то конструктором по умолчанию объект "а" будет размещен хрен знает по какому адресу
А если есть, то по какому?
Цитата:
Сообщение от KAMLS Посмотреть сообщение
Но зачем ссылка?
В смысле зачем? Мало ли зачем, в коде ж просто пример использования.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
А для этого столько наворотить надо с перегрузкой "="
нет, ссылка же. Хоть вообще удалите = (сделать private или в С++11 delete).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.08.2017, 18:26   #5
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Если у вас в классе не прописан конструктор, то конструктором по умолчанию объект "а" будет размещен хрен знает по какому адресу и хрен знает с каким значением, и будет дожидаться вашей инициализации.
Жесть. Где такому учат?
Croessmah вне форума Ответить с цитированием
Старый 05.08.2017, 18:46   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Player150 Посмотреть сообщение
какое конкретно значение и адрес имеет a в первой инструкции?
Вызовется конструктор по умолчанию (который без параметров). Если никакого конструктора для класса не писали, то он автоматом пустой сгенерируется. Адрес - какой повезёт.
Цитата:
Сообщение от Player150 Посмотреть сообщение
вот например когда имеется определение int ix = 0; понятно что ix конкретно идентифицирует ячейку со своим адресом и значением.
И какой адрес у ix? раз всё понятно
Цитата:
Сообщение от Player150 Посмотреть сообщение
может быть под капотом в данной инструкции передается управление конструктору по-умолчанию и тогда данный объект будет иметь все свойства конструктора?
Что такое свойства конструктора? В С++ выделяется область памяти, потом вызывается конструктор, что в конструкторе написано, то и выполняется, те значения и будут. Адрес объекта будет - какой дадут. Есть еще частные случаи и нюансы, когда в конструкторе возникает исключение, например.
Цитата:
Сообщение от Player150 Посмотреть сообщение
а во второй инструкции все свойства функции getSize()?
что такое свойства функции? Просто для объекта a вызывается метод getSize. Нет никаких свойств и т.п. Сначала вызвался конструктор для объекта a, который этот объект привёл к какому-то состоянию (а может ничего не сделал). Потом вызвали для объекта метод getSize, который может как-то изменил состояние объекта, а может просто вернул значение, тут нужно смотреть опять чего в этом методе написано.
Цитата:
Сообщение от Player150 Посмотреть сообщение
кстати, что происходит в четвертой инструкции?
по сути 4 эквивалент 2. Один и тот же метод вызывается для одного и того же объекта.
Цитата:
Сообщение от Player150 Посмотреть сообщение
почему, когда я использовал & с операндом в виде имени a, я получил адрес первого члена данных в private?
Получили указатель на объект, вероятно этот член первым хранится в объекте, вот и совпадает адрес на объект с адресом на первый член.
Цитата:
Сообщение от Player150 Посмотреть сообщение
надеюсь понятно спросил, просто мне это важно знать, как это все работает. где об этом можно почитать? спасибо
Что как хранится и происходит написано в стандарте языка. Еще в книгах пишут такое.
pu4koff вне форума Ответить с цитированием
Старый 06.08.2017, 00:45   #7
Player150
Пользователь
 
Регистрация: 21.07.2017
Сообщений: 12
По умолчанию

pu4koff,
Спасибо!) Простите, я еще много не пониманию, насчет "свойств" не берите в голову) Задам последний вопрос и все на этом пока что, если вопрос я задам не правильный, еще раз извините.

Вот например класс:

Код:
class A {
   
   private:
     int z;
   
    public:
     A(): z(0) {}
     int c;
 }

  int main() {
     
    A obj;
    obj.c = 5;

    return 0;
};
Где obj.c = 5 , я же правильно понимаю, что левый операнд (имя obj) оператора доступа просто говорит к какому экземпляру класса относится данное поле, и в этой инструкции lvalue, по сути, является только c?
Player150 вне форума Ответить с цитированием
Старый 06.08.2017, 03:28   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Player150 Посмотреть сообщение
lvalue, по сути, является только c?
Что значит "по сути"? lvalue, грубо говоря, - это то конкретное место, куда будет сохранён результат операции. В памяти может быть одновременно тысяча экземпляров объекта. И в каждом из них есть своё поле с. Нужно же как-то выделить из тысячи то единственное, которое и примет значение на этот раз
Black Fregat вне форума Ответить с цитированием
Старый 06.08.2017, 06:11   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Player150 Посмотреть сообщение
Где obj.c = 5 , я же правильно понимаю, что левый операнд (имя obj) оператора доступа просто говорит к какому экземпляру класса относится данное поле, и в этой инструкции lvalue, по сути, является только c?
В принципе, да.
pu4koff вне форума Ответить с цитированием
Старый 07.08.2017, 05:57   #10
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение типа класса по переменной на объект этого класса при компиляции phomm Общие вопросы Delphi 24 08.04.2011 14:11
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
Размер имеет значение Xenofibrius Общие вопросы Delphi 3 20.04.2008 23:38