为什么不能在指针对象上调用函数?

Why can't you call functions on a pointer object?

本文关键字:调用 函数 对象 不能 指针 为什么      更新时间:2023-10-16

编辑:对不起愚蠢的标题;通过"指针对象",我想我的意思是取消引用的对象指针(如果这是任何澄清的话)。

我是C++的新手,我一直在努力习惯它的特质(来自Java)。

我知道这通常不是必需的,但我想尝试通过指针传递对象。当然,它可以工作,但我希望这也有效:

void test(Dog * d) {
*d.bark();
}

事实并非如此。这是为什么呢?我发现我可以做到以下几点:

void test(Dog * d) {
Dog dawg = *d;
dawg.bark();
}

它完美无缺。这对我来说似乎太多余了。

如有任何澄清,将不胜感激。谢谢!

Imo . 优先于取消引用 * ,因此:

(*d).bark();

或者,对于指针,如其他回复中所述 - 使用 ->

d->bark();

请务必检查空:)

只是为了澄清情况,您可以使用(*pointer).member()pointer->member() - a->b等同于(*a).b

当然,这是假设您正在处理"真实"(内置)指针。可以超载operator->做一些不同的事情。不过,超载的operator->受到一定限制,这通常会防止人们对它们做奇怪的事情。您可能会遇到的一件事(例如,使用某些迭代器的实现)根本无法支持operator->,因此尝试使用它会导致编译错误。尽管这样的实现(大部分?)早已不复存在,但您可能仍然会看到一些(通常是较旧的)代码使用(*iterator).whatever而不是->

您必须在指针上使用 -> 运算符。 .运算符用于非指针对象。

在第一个代码段中,尝试d->bark(); 。 应该工作正常!


编辑:其他答案建议(*d).bark();。 这也行得通;(*d)取消引用指针(即将其转换为普通对象),这就是.运算符工作的原因。 要使用原始指针,只需d,您必须使用我描述的->运算符。

希望这有帮助!

它都在括号中:

(*d).bark();

每个人都缺少一点来回答:运算符优先级

operator.的优先级

高于(一元)指针间接(*)操作器的优先级。这就是为什么需要括号的原因。这就像在 + 周围加上括号以获得正确的平均值:

int nAverage = (n1+n2) / 2;

对于指针间接情况,编译器会给您错误!

使用指针时需要使用->运算符,即代码应该d->bark();