对内存动态分配的类不使用"*"的逻辑

The logic not to use "*" for class that memory dynamically allocated

本文关键字:内存 动态分配      更新时间:2023-10-16

所以我正在学习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);

这对编译器来说意味着同样的意思,但使人类更清楚这是一个称为pOneperson*(指向person的指针)。

现在更有意义的是,您仍然对pOne执行指针操作,而不是在*pOne上执行指针操作。

较旧的右对齐星号方法来自 C 世界,其中人们希望您将其视为"*pOne有一个person"。而且,在您的情况下,这是真的:(*pOne).getName()也会起作用。然而,这对我来说看起来很丑陋,*pOne并不总是一个实际的person——这取决于指针的设置(如果有的话)。

这里的关键点是->(如pOne->getName())为您取消引用。(*pOne)->getName()会做两次。

pTwo.getName()的最后一个示例只是一个沼泽标准对象访问。