Путаница в адресах памяти объектов и членов данных

Когда мы объявляем элемент данных с одним и тем же именем внутри класса, а также параметр функции внутри того же класса, мы используем this->, чтобы указать на расположение класса в памяти. Что меня смущает, так это: скажем, мы объявляем элемент данных с именем «meloncolor», а затем объявляем внутри класса параметр функции с тем же именем, например:

class fruitcolor{
   public:
       string meloncolor;
       void changefruitcolor(string meloncolor)
{ this-> meloncolor = meloncolor }
};

Скажем, наш объект хранится в ячейке памяти 0xblahblahblah, поэтому оба члена/переменных данных «moloncolor» должны быть в одном и том же месте? Если да, то как программа/компьютер различает друг друга после указания адреса класса с помощью «this->», если они хранятся в одном и том же месте?


person Mark Hennery    schedule 23.04.2015    source источник
comment
С чего вы взяли, что они хранятся в одном и том же месте???   -  person barak manos    schedule 23.04.2015


Ответы (3)


"Что в имени? То, что мы называем розой, по любому другому имени пахло бы так же сладко."

Концепции

Объект не имеет имени. Объект — это место в памяти определенного типа и размера, соответствующего типу, имеющее значение (назначенное/неназначенное), возможно, указанное идентификатором.

Пространство имен – это группа символов/идентификаторов, которая обеспечивает уровень направления для конкретных идентификаторов, что позволяет различать идентичные идентификаторы. Пространство имен обеспечивает механизм, в котором идентификаторы с одним и тем же символическим именем могут сосуществовать (сосуществовать) без конфликта/переопределения/затенения.

Объяснение

В ваших конкретных случаях параметр meloncolor и член экземпляра meloncolor ссылаются на разные объекты с одинаковым символическим именем, но в другом пространстве имен. Локальные переменные и параметры функции имеют область действия уровня функции и имеют локальное пространство имен. Любая переменная/идентификатор с конфликтом имени с глобальным пространством имен или пространством имен класса/структуры будет переопределена. Чтобы сделать явное различие, нам нужно использовать разрешение на уровне области видимости. Например, переменная экземпляра в C++ использует оператор выбора члена . для разрешения имени символа, определенного в текущем экземпляре объекта.

person Abhijit    schedule 23.04.2015
comment
Спасибо за ответ и помощь! Я все еще немного в замешательстве. Хранятся ли объекты и элементы данных объекта в одном и том же месте? - person Mark Hennery; 26.04.2015

так что оба члена/переменных данных "moloncolor" должны находиться в одном и том же месте?

Нет. Один хранится в экземпляре класса, а другой — в стеке вызовов функций. Использование this-> полностью уточняет переменную-член, чтобы устранить неоднозначность ее имени из имени параметра.

person James Adkison    schedule 23.04.2015
comment
Спасибо за ответ и помощь! - person Mark Hennery; 26.04.2015

Как вы уже знаете, существуют разные типы/область действия переменных, компилятор решает, где и как их хранить, основываясь на их типах/области действия. Для вашего понимания я разделяю вашу проблему на две точки, надеюсь, вы сможете понять.

1: переменные экземпляра: эти переменные хранятся в куче памяти. Ваша "общественность: string meloncolor"; переменная уровня класса, также известная как instance.

2: Локальные переменные: этот тип переменных хранится в стеке, ваш «void changefruitcolor (string meloncolor)» является локальной переменной.

Таким образом, они оба хранятся в разных местах памяти, могут иметь разные значения одновременно.

person user3782095    schedule 23.04.2015
comment
Спасибо за ответ и помощь! - person Mark Hennery; 26.04.2015