Объркване на адреса на паметта на членове на обекти и данни

Когато декларираме член с данни с същото име в клас, както и функционалния параметър в рамките на същия клас, ние използваме "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: Променливи на екземпляр: Тези променливи се съхраняват в паметта на стека. Вашият "public: string meloncolor;" е променлива на ниво клас, известна също като екземпляр.

2: Локални променливи: Този тип променливи се съхраняват в стека, вашата "void changefruitcolor(string meloncolor)" е локална променлива.

И така, и двете се съхраняват на различно място в паметта, може да имат различни стойности по едно и също време.

person user3782095    schedule 23.04.2015
comment
Благодаря за отговора и помощта! - person Mark Hennery; 26.04.2015