程序员在访问对象成员时必须区分.
和->
的真正原因是什么?
void foo( Point &p ) {
p.x ;
p->y; // syntax error
}
void foo( Point *p ) {
p.x ; // syntax error
p->y;
}
我的意思是,无论如何,他们都引用了对象,p 。
为什么我每次都要检查p是什么?编译器不能理解吗?
为什么他们不允许它接受两者的.
语法?对于堆栈对象来说也没问题。
如果是由于C-tradition,那么
.
和->
访问者?超过15年,我一直谦卑地认为编译错误是我的错!
答案 0 :(得分:8)
因为p->d
实际上意味着(*p).d
。它进行解除引用,然后进行成员访问。引用的行为类似于对象,因此它们不需要解除引用(它们也是C ++特性,而指针是从C继承的);它一直保持这种向后兼容性。
C ++充满了这样的不一致,但通常没有更好的选择来添加新功能和保持旧代码正常工作。重写旧代码不是一种选择。
答案 1 :(得分:6)
因为你可能有一个智能指针。在这种情况下,您可以使用.
和真实对象的成员使用->
访问智能指针的成员。
答案 2 :(得分:4)
它们不一样。
.
是指您有实际物品的时间
->
是指向对象的指针。
.
运算符无法重载,而->
运算符可能会重载。
答案 3 :(得分:3)
理论上,至少在C语言中,语言本来可以用来做到这一点。 D(例如)完全按照你的要求行事。
在C ++中,事情可能是一个很大的问题 - x->y
和x.y
完全有可能同时有效,但完全是不同的事物(即,重载operator->
)的智能指针:
#include <iostream>
class P {
class inner {
public:
inner() : x(1) {}
int x;
} i;
public:
int x;
P() :x(0) {}
inner *operator->() { return &i; }
};
int main() {
P p;
std::cout << p.x << "\t" << p->x << "\n";
return 0;
}
答案 4 :(得分:3)
智能指针:它们可能同时包含两个成员并指向其他一些值。例如:
boost::smart_ptr<someclass> x(new someclass())
x->some_method();
x.reset();
答案 5 :(得分:2)
因为指针和引用不同,并且处理方式不同?
我在阅读代码时欣赏视觉差异。
答案 6 :(得分:2)
考虑以下代码:
x.myInt = 3;
cout << (int)&x <<< endl;
我们在这里打印什么?指针的地址或对象的地址?
我欢迎.
和->
之间的区别,因为它为您提供了有关代码的更多背景信息。
根据您建议的更改,如果不查找x是什么类型,我们就不会知道差异。
答案 7 :(得分:2)
这是一个方便的问题:p-&gt; foo与(* p)相同.foo
当你用简单的+和=运算符表达相同的逻辑时,就像问为什么有++或+ =运算符一样。
答案 8 :(得分:0)
我可以想到一个原因:开发人员编写的内容与他们实际想要发生的内容之间的映射越复杂,当出现类型或语法错误时,弄清楚它们的真正意义就越困难。< / p>