对象和数据成员内存地址混乱

Object and data members memory address confusion

当我们在 class 中声明 相同 名称的数据成员以及相同 class 中的函数参数时,我们使用 "this->"指向class的内存位置。我感到困惑的是:假设我们声明了一个名为 "meloncolor" 的数据成员,然后在 class 中声明了一个同名的函数参数,例如:

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

假设我们的对象存储在内存位置 0xblahblahblah,那么 "moloncolor" 数据 members/variables 应该在同一个位置?如果是,program/computer如果存储在同一位置,使用"this->"指向class地址后,如何区分彼此?

so both "moloncolor" data members/variables should be at the same location?

没有。一个存储在 class 实例中,一个存储在函数调用堆栈中。使用 this-> 完全限定成员变量以消除其名称与参数名称的歧义。

"What's in a name? That which we call a rose By any other name would smell as sweet."

概念

对象 没有名称。对象是内存中某种类型的位置,大小符合该类型,具有可能由标识符引用的值(已分配/未分配)。

Namespace 是一组符号/标识符,它为特定标识符提供了一定程度的方向,从而可以区分相同的标识符。命名空间提供了一种机制,其中具有相同符号名称的标识符可以共存(共存)而不会冲突/覆盖/隐藏。

说明

在您的特定情况下,参数 meloncolor 和实例成员 meloncolor 引用具有相同符号名称但在不同命名空间中的不同对象。函数的局部变量和参数具有函数级作用域并具有局部名称空间。任何名称与全局或 class/struct 命名空间冲突的 variable/identifier 都将被覆盖。为了明确区分,我们需要使用范围级分辨率。例如 C++ 中的实例变量,我们使用成员选择运算符 . 对当前对象实例中定义的符号进行名称解析。

如您所知,有不同的 types/scope 个变量,编译器根据它们的 types/scope 决定将它们存储在何处以及如何存储。为了您的理解,我将您的问题分为两点希望您能理解。

1:实例变量:这些变量存储在堆内存中。您的 "public: string meloncolor;" 是 class 级变量也称为实例。

2:局部变量:这类变量存储在栈中,你的 "void changefruitcolor(string meloncolor)" 是局部变量。

因此,它们都存储在内存中的不同位置,可能同时具有不同的值。