【问题标题】:Object and data members memory address confusion对象和数据成员内存地址混淆
【发布时间】:2015-07-01 03:38:22
【问题描述】:

当我们在一个类中声明一个同名的数据成员以及同一个类中的函数参数时,我们使用“this->”来指向该类的内存位置.我感到困惑的是:假设我们声明了一个名为“meloncolor”的数据成员,然后在类中声明了一个同名的函数参数,比如:

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

假设我们的对象存储在内存位置 0xblahblahblah,那么两个“moloncolor”数据成员/变量应该在同一个位置?如果是这样,如果它们存储在同一位置,程序/计算机在使用“this->”指向类地址后如何区分?

【问题讨论】:

  • 是什么让你觉得它们“存储在同一个位置”???

标签: c++ pointers memory this


【解决方案1】:

“名字里有什么?我们称之为玫瑰的任何其他名字都会闻起来很香。”

概念

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

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

说明

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

【讨论】:

  • 感谢您的回复和帮助!我还是有点迷茫。对象和对象数据成员是否存储在同一位置?
【解决方案2】:

所以两个“moloncolor”数据成员/变量应该在同一个位置?

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

【讨论】:

  • 感谢您的回复和帮助!
【解决方案3】:

正如您已经知道变量有不同的类型/范围,编译器会根据它们的类型/范围来决定将它们存储在何处以及如何存储它们。为了您的理解,我将您的问题分为两点希望您能理解。

1:实例变量:这些变量存储在堆内存中。你的“public:string meloncolor;”是类级别的变量,也称为实例。

2:局部变量:这种类型的变量存储在堆栈中,你的 “void changefruitcolor(string meloncolor)”是一个局部变量。

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

【讨论】:

  • 感谢您的回复和帮助!
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2015-02-26
  • 2011-12-28
相关资源
最近更新 更多