2010-05-29 105 views
7

可能显示的文件:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
Why does C have a distinction between -> and . ?- >和>之间的区别是什么。在C/C++?

我知道由指针操作者的构件操作者和构件之间的差值( - >)(。)。

为什么C设计人员为此访问创建了不同的运算符?为什么编译器不能自行解决?

如果你总是使用a。是否有任何情况存在于您指的是会员还是会员的含义模糊的情况下?

编辑:我不是在寻找“(* a).b”语法。我问为什么设计师不让你使用“a.b”而不是“a-> b”?

+0

该符号最初来自C. – 2010-05-29 23:53:21

+0

好点:我改变了问题使用C而不是C++。 – 2010-05-29 23:56:24

+0

[C++:ptr-> hello();/* VERSUS * /(* ptr).hello();](http://stackoverflow.com/questions/447543/c-ptr-hello-versus-ptr-hello)和[有什么区别(。)点运算符和( - >)箭头在c + +](http://stackoverflow.com/questions/1238613/what-is-the-difference-between-dot-operator-and-arrow-in-c) – 2010-05-30 00:05:38

回答

0

如果您的语言核心为“便携式汇编程序”,则不要试图隐藏用户的实现细节。当然,编译器可以找出表达式a.b中的a是一个指针。你可以吗?可靠?每时每刻?在毛茸茸的,复杂的代码?你能不能想象一个不能很快注意到的情况,a是一个指针可能是一个问题?

停止思考“难写”,并开始思考“容易阅读”。 (是的,我知道,这违背了整个C程序员的神话!)你会阅读的代码比你写的代码要多出几个数量级。

6

你真的想让编译器“自行解决吗?”如果有,那么下面将评估为同样的事情(假设p是指向一个结构与一个成员x):

(*p).x; 
p.x 

如果指针的间接引用是隐性存在,它应该是隐无处不在?考虑:

int* p; 
int i = p; // should dereferencing be implicit here as well? 

我认为这会比有两个单独的运营商更令人困惑。

让两个操作员帮助跟踪您拥有多少层间接寻址也是有帮助的。当然,->运营商并非绝对必要的,因为p->x等同于(*p).x,但它确实使代码更清晰易读。

+0

您还必须考虑在涉及更多级别的间接时应该发生什么情况:是否允许编译器在使用'.'时取消任意深度的struct指针或将其限制为最多一个间接程度?这两种解决方案对我来说都是“正确的”...... – Christoph 2010-05-30 00:12:06

+0

好吧,因为这个(对于' - >'和'::'只有''.''是在某些语言中它是如何完成的,所以这是可能的。而且看起来来自这些语言的C或C++的人们发现,必须区分它们使人感到困惑。 – sbi 2010-05-30 00:16:08

+0

另请参阅[这个答案](http://stackoverflow.com/questions/2843916/c-help-about-class-and-error-c3861/2843960#2843960)。 – sbi 2010-05-30 00:21:58

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 
-1

两个fo->bar(*fo).bar做同样的事情!

该语言仅提供间接访问操作符,即箭头(->)并将其视为单个符号。

+0

为什么这是upvoted?它不回答这个问题。 – 2010-05-30 07:06:35

+0

@好事实际上,你编辑了你的问题! – Secko 2010-05-30 11:17:48

-1

- >运算符只是通过指针引用对象的方法或成员的一种简单方法,而不是使用类似(* p).member或(* p).method之类的方法。

示例:

MyClass * MyObj;方法();();}}比(* MyObj).method()更好的阅读和理解;

0

C++让你覆盖->运营商。当你有一个像std::auto_ptr这样的智能指针类时,同一个变量可能同时支持.->,您在其上使用.来访问auto_ptr->的成员,以访问其包含的指针的成员。

相关问题