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

时间:2015-04-23 06:15:33

标签: c++ pointers memory this

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

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

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

3 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:1)

  

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

概念

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

命名空间是一组符号/标识符,它们为特定标识符提供指导级别,从而可以区分相同的标识符。命名空间提供了一种机制,其中具有相同符号名称的标识符可以共存(共存)而不会冲突/覆盖/遮蔽。

说明

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

答案 2 :(得分:1)

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

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

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

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