1

编辑:对愚蠢的标题感到抱歉;“指针对象”我想我的意思是取消引用的对象指针(如果有任何澄清的话)。

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

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

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

但事实并非如此。为什么是这样?我发现我可以执行以下操作:

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

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

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

4

6 回答 6

9

海事组织。优先于取消引用 * ,因此:

(*d).bark();

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

d->bark();

一定要检查 null :)

于 2012-07-04T04:25:17.667 回答
7

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

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

于 2012-07-04T04:31:54.577 回答
6

全部在括号中:

(*d).bark();
于 2012-07-04T04:25:29.863 回答
6

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

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


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

希望这可以帮助!

于 2012-07-04T04:25:31.027 回答
3

每个人都缺少一点要回答的问题:Operator Precedence

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

int nAverage = (n1+n2) / 2;

对于指针间接的情况,你很幸运编译器给你错误!

于 2012-07-04T05:10:03.453 回答
2

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

于 2012-07-04T04:25:31.570 回答