为什么不能在指针对象上调用函数?
Why can't you call functions on a pointer object?
编辑:对不起愚蠢的标题;通过"指针对象",我想我的意思是取消引用的对象指针(如果这是任何澄清的话)。
我是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();
。
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?