ICo*_*mer 1 c++ pointers pass-by-reference operator-precedence
编辑:抱歉愚蠢的标题; 通过"指针对象"我想我的意思是解除引用的对象指针(如果这是任何澄清).
我是C++的新手,我一直在努力适应它的特性(来自Java).
我知道这通常不是必需的,但我想尝试通过它的指针传递一个对象.当然,它可以工作,但我也希望这也可以工作:
void test(Dog * d) {
*d.bark();
}
Run Code Online (Sandbox Code Playgroud)
它没有.为什么是这样?我发现我可以做到以下几点:
void test(Dog * d) {
Dog dawg = *d;
dawg.bark();
}
Run Code Online (Sandbox Code Playgroud)
它完美无瑕.这对我来说似乎是多余的.
任何澄清将不胜感激.谢谢!
伊莫 优先于取消引用*,因此:
(*d).bark();
Run Code Online (Sandbox Code Playgroud)
或者,对于指针,如其他回复中所述 - 使用 ->
d->bark();
Run Code Online (Sandbox Code Playgroud)
一定要检查空:)
只是为了澄清的情况下,可以使用两种 (*pointer).member()或pointer->member()- a->b相当于(*a).b.
当然,这是假设你正在处理"真正的"(内置)指针.这是可能的超载operator->做不同的事情.operator->虽然过载受到一定程度的限制,这通常会阻止人们对它们做出太奇怪的事情.您可能遇到的一件事(例如,使用某些迭代器的旧实现)根本就不支持operator->,因此尝试使用它将导致编译错误.虽然这些实现(大部分?)早已不复存在,但您仍可能会看到一些(通常是较旧的)代码,(*iterator).whatever而不是->因为这样.
你必须->在指针上使用运算符.该.运营商对非指针的对象.
在您的第一个代码段中,尝试一下d->bark();.应该工作正常!
编辑:其他答案建议(*d).bark();.这也会奏效; 的(*d)解引用指针(即把它变成一个正常对象)这就是为什么.操作者的工作原理.要使用原始指针,只需d使用->我所描述的运算符.
希望这可以帮助!