可能重复:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
Why does C have a distinction between -> and . ?
我知道成员运算符(。)和指针运算符( - >)之间的区别。
为什么C设计师为此访问创建了不同的运算符?为什么编译器不能单独解决它?
如果你总是使用一个。是否存在模糊的情况,无论你是指成员还是指针成员?
编辑:我不是在寻找“(* a).b”语法。我问为什么设计师不允许你使用“a.b”代替“a-> b”?
答案 0 :(得分:6)
你真的希望编译器能够“自己解决这个问题吗?”如果确实如此,则以下内容将评估相同的内容(假设p
是指向具有成员x
的结构的指针):
(*p).x;
p.x
如果指针的解除引用是隐含的,那么它是否应该隐式无处不在?考虑:
int* p;
int i = p; // should dereferencing be implicit here as well?
我认为这比拥有两个独立的运营商要困难得多。
让两个操作员帮助跟踪您拥有的间接层数也会很有帮助。当然,->
运算符对此并不是必需的,因为p->x
等同于(*p).x
,但它确实使代码更清晰,更易于阅读。
答案 1 :(得分:2)
是的,歧义来自于能够覆盖两个运营商。最好的例子可能是shared pointers。共享指针可以与。一起使用。和 - >运营商和两者都有不同的含义。
使用 - >您访问指向和使用的对象。您可以访问共享指针本身的成员。
例如:
class MyObject {
public:
void myFunction() {}
};
boost::shared_ptr<MyObject> ptr;
ptr.use_count(); // calls use_count, which is a member of boost::shared_ptr.
ptr->myFunction(); // calls MyObject::myFunction, as the operator-> is overriden
答案 2 :(得分:0)
如果您的语言本身就是“便携式汇编程序”,那么您不要试图隐藏用户的实现细节。当然,编译器可以在表达式a.b
中找出问题中的a
是一个指针。你能?可靠?每时每刻?在毛茸茸的复杂代码中?您是否可以设想一种无法快速记录a
指针可能是个问题的情况?
不再考虑“难以写”而开始考虑“易读”。 (是的,我知道。这违背了整个C程序员的神话!)你将比你写的代码更频繁地阅读几个数量级的代码。
答案 3 :(得分:0)
C ++允许您覆盖->
运算符。当您拥有类似std::auto_ptr
的智能指针类时,同一个变量可能同时支持.
和->
,您可以使用.
来访问auto_ptr
的成员}和->
访问它包含的指针的成员。
答案 4 :(得分:-1)
(*a).b
与a->b
答案 5 :(得分:-1)
fo->bar
和(*fo).bar
都做同样的事情!
该语言只是为间接访问提供操作员,即箭头(->
)并将其视为单个符号。
答案 6 :(得分:-1)
- &gt; operator只是一种通过指针引用对象方法或成员的简单方法,而不是使用像(* p).member或(* p).method这样的东西。
示例:
MyClass * MyObj;
MyObj-&GT;方法();比(* MyObj).method();
更好阅读和理解