Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象和数据成员内存地址混淆_C++_Pointers_Memory_This - Fatal编程技术网

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

C++ 对象和数据成员内存地址混淆,c++,pointers,memory,this,C++,Pointers,Memory,This,当我们在一个类中声明一个名为的数据成员以及同一个类中的函数参数时,我们使用“this->”来指向该类的内存位置。我感到困惑的是:假设我们声明一个名为“meloncolor”的数据成员,然后在类中声明一个同名的函数参数,比如说: class fruitcolor{ public: string meloncolor; void changefruitcolor(string meloncolor) { this-> meloncolor = meloncol

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

class fruitcolor{
   public:
       string meloncolor;
       void changefruitcolor(string meloncolor)
{ this-> meloncolor = meloncolor }
};
假设我们的对象存储在内存位置0xblahblahblah,那么两个“moloncolor”数据成员/变量应该位于同一位置?如果是这样,如果程序/计算机存储在同一位置,那么在使用“this->”指向类地址后,它们如何区分彼此

那么两个“moloncolor”数据成员/变量应该在同一位置

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

“名字里有什么?我们用其他名字叫玫瑰的东西闻起来也一样甜。”

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

名称空间是一组符号/标识符,为特定标识符提供了一个方向级别,从而可以区分相同的标识符。命名空间提供了一种机制,其中具有相同符号名的标识符可以共存(共存),而不会发生冲突/重写/隐藏

解释
在特定情况下,参数meloncolor和实例成员meloncolor引用具有相同符号名但位于不同命名空间中的不同对象。函数的局部变量和参数具有函数级作用域和局部命名空间。任何名称与全局或类/结构命名空间冲突的变量/标识符都将被重写。要进行明确的区分,我们需要使用范围级别的解析。例如C++中的变量,我们使用成员选择运算符<代码> > />代码>当前对象实例中定义的符号的名称解析。

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

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

2:局部变量:这种类型的变量存储在堆栈上,您的 “void changefourtcolor(字符串meloncolor)”是一个局部变量


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

是什么让您认为它们“存储在同一位置”?感谢您的回复和帮助!我还是有点困惑。对象和对象数据成员是否存储在同一位置?感谢您的回复和帮助!谢谢你的回复和帮助!