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

时间:2012-07-04 04:23:28

标签: c++ pointers pass-by-reference operator-precedence

编辑:抱歉这个愚蠢的头衔;通过“指针对象”我想我的意思是解除引用的对象指针(如果这是任何澄清)。

我是C ++的新手,我一直在努力适应它的特性(来自Java)。

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

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

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

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

它完美无瑕。这对我来说似乎是多余的。

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

6 个答案:

答案 0 :(得分:9)

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

(*d).bark();

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

d->bark();

一定要检查null:)

答案 1 :(得分:7)

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

当然,这是假设你正在处理“真正的”(内置)指针。 可能重载operator->以执行不同的操作。虽然operator->的过载受到一定程度的限制,但这通常会阻止人们对它们进行太多奇怪的事情。您可能遇到的一件事(例如,使用某些迭代器的实现)根本不支持operator->,因此尝试使用它将导致编译错误。虽然这些实现(大部分?)早已不复存在,但您可能仍会看到一些(通常较旧的)代码使用(*iterator).whatever代替->,因为这样。

答案 2 :(得分:6)

全部在括号中:

(*d).bark();

答案 3 :(得分:6)

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

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


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

希望这有帮助!

答案 4 :(得分:3)

每个人都缺少一点回答:运营商优先

operator.的优先级高于(一元)指针间接(*)opeartor的优先级。这就是为什么需要括号。这就像在左右括号括起来得到正确的平均值:

int nAverage = (n1+n2) / 2;

对于指针间接情况,你是编译器给你错误的lukcy!

答案 5 :(得分:2)

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