什么是差异的理由 - >和。在c / c ++中?

时间:2010-05-29 23:49:42

标签: c++ c standards

  

可能重复:
  C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
  Why does C have a distinction between -> and . ?

我知道成员运算符(。)和指针运算符( - >)之间的区别。

为什么C设计师为此访问创建了不同的运算符?为什么编译器不能单独解决它?

如果你总是使用一个。是否存在模糊的情况,无论你是指成员还是指针成员?

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

7 个答案:

答案 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).ba->b

相同

答案 5 :(得分:-1)

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

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

答案 6 :(得分:-1)

- &gt; operator只是一种通过指针引用对象方法或成员的简单方法,而不是使用像(* p).member或(* p).method这样的东西。

示例:

MyClass * MyObj;

MyObj-&GT;方法();比(* MyObj).method();

更好阅读和理解