编辑:抱歉这个愚蠢的头衔;通过“指针对象”我想我的意思是解除引用的对象指针(如果这是任何澄清)。
我是C ++的新手,我一直在努力适应它的特性(来自Java)。
我知道通常不需要,但我想尝试通过指针传递一个对象。当然,它可以工作,但我也希望这也可以工作:
void test(Dog * d) {
*d.bark();
}
但事实并非如此。为什么是这样?我发现我可以做到以下几点:
void test(Dog * d) {
Dog dawg = *d;
dawg.bark();
}
它完美无瑕。这对我来说似乎是多余的。
任何澄清将不胜感激。谢谢!
答案 0 :(得分:9)
(*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();
。