对内存动态分配的类不使用"*"的逻辑
The logic not to use "*" for class that memory dynamically allocated
所以我正在学习C ++,我刚刚学会了为类动态分配的内存。 有些东西让我感觉很奇怪。
int main()
{
person* pOne = new person("mike", 35);
cout << pOne << " " << pOne->getName() << endl;
person pTwo = { "dave", 30 };
cout << pTwo.getName() << endl;
return 0;
}
我认为当我们想在 pOne 中调用 getName() 函数时,我们应该像*pOne->getName()
一样做,因为 pOne 保存内存位置,而不是 person 对象本身。 但是如果我这样做,我会遇到编译器错误。
我使用未动态分配的pTwo
进行操作,并且它的工作方式就像我想要的那样。
那么,有人可以解释一下在尝试调用函数时不使用"*"的逻辑吗?
内置运算符a->b
定义为(*a).b
,因此取消引用被"隐藏"在->
运算符中。
->
只是一个句法糖:a->foo
与(*a).foo
相同。因此,当您使用->
时,您实际上取消了对指针的引用。
我使用未动态分配的 pTwo 来做这件事,它的工作方式就像我想要的那样。 那么,有人可以解释一下在尝试调用函数时不使用"*"的逻辑吗?
您混合了不同的概念,它与您如何分配内存无关,而是与您访问成员的变量类型无关:
struct Foo { void bar(); };
Foo f; // type of f is Foo
f.bar(); // access on type Foo is through .
Foo *pf = &f; // type of pf is Foo*
pf->bar(); // derefence and access on type Foo* is through ->
(*pf).bar(); // the same as above and since type of *pf is Foo we can use .
(&f)->bar(); // type of &f is Foo*, so we can use ->
(*(&f)).bar(); // crazy stuff
如果你改变你编写代码的方式,它会更清楚。
而不是:
person *pOne = new person("mike", 35);
写:
person* pOne = new person("mike", 35);
这对编译器来说意味着同样的意思,但使人类更清楚这是一个称为pOne
的person*
(指向person
的指针)。
现在更有意义的是,您仍然对pOne
执行指针操作,而不是在*pOne
上执行指针操作。
较旧的右对齐星号方法来自 C 世界,其中人们希望您将其视为"*pOne
有一个person
"。而且,在您的情况下,这是真的:(*pOne).getName()
也会起作用。然而,这对我来说看起来很丑陋,*pOne
并不总是一个实际的person
——这取决于指针的设置(如果有的话)。
这里的关键点是->
(如pOne->getName()
)为您取消引用。写(*pOne)->getName()
会做两次。
pTwo.getName()
的最后一个示例只是一个沼泽标准对象访问。
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它