C++ ->;和。在c/c++;?

C++ ->;和。在c/c++;?,c++,c,standards,C++,C,Standards,可能的重复项: 我知道member操作符(.)和member by pointer操作符(->)之间的区别 为什么C设计人员为这种访问创建了不同的操作符?为什么编译器不能自己解决呢 如果你总是使用一个。是否存在不明确的情况,即您指的是成员还是指针成员 编辑:我不是在寻找“(*a).b”语法。我想问的是,为什么设计者不允许你使用“a.b”而不是“a->b”?你真的希望编译器“自己解决它吗?”如果它这样做了,那么下面的计算结果将是相同的(假设p是指向具有成员x的结构的指针): 如果指针的解引用在

可能的重复项:

我知道member操作符(.)和member by pointer操作符(->)之间的区别

为什么C设计人员为这种访问创建了不同的操作符?为什么编译器不能自己解决呢

如果你总是使用一个。是否存在不明确的情况,即您指的是成员还是指针成员


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

你真的希望编译器“自己解决它吗?”如果它这样做了,那么下面的计算结果将是相同的(假设
p
是指向具有成员
x
的结构的指针):

如果指针的解引用在那里是隐式的,那么它应该在任何地方都是隐式的吗?考虑:

int* p;
int i = p; // should dereferencing be implicit here as well?
我认为这比有两个单独的操作员要混乱得多


有两个操作符帮助跟踪有多少层间接寻址也很有帮助。诚然,
->
操作符并不是严格必要的,因为
p->x
相当于
(*p).x
,但它确实使代码更清晰、更容易阅读。

(*a).b
a->b
是的,模糊性来自于能够覆盖这两个操作符。最好的例子也许是。共享指针可与一起使用。和->运算符和都有不同的含义

使用->访问指向的对象,并使用。您可以访问共享指针本身的成员

例如:

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
类MyObject{
公众:
void myFunction(){}
};
boost::共享的ptr;
ptr.使用_count();//调用使用_count,它是boost::shared_ptr的成员。
ptr->myFunction();//调用MyObject::myFunction,因为运算符->被重写

条形码和
(*fo.bar
做同样的事情


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

当您拥有一种以“可移植汇编程序”为核心的语言时,您不会试图向用户隐藏实现细节。当然,编译器可以计算出表达式
a.b
中的
a
是一个指针。你能?可靠地?总是用毛茸茸的复杂代码?你能想象一种情况吗?如果不能很快地注意到
a
是一个指针,这可能是一个问题


停止用“难写”来思考,开始用“易读”来思考。(是的,我知道。这与整个C程序员的神话背道而驰!)您阅读代码的频率将比编写代码的频率高出几个数量级。

操作符只是一种通过指针引用对象的方法或成员的更简单的方法,而不是使用类似(*p).member或(*p).method的东西

例如:

MyClass*MyObj


MyObj->method();比(*MyObj.method())更易于阅读和理解

C++允许您覆盖
->
操作符。当您有一个像
std::auto_ptr
这样的智能指针类时,同一个变量可能同时支持
->
,您可以在其上使用
访问
auto_ptr
的成员,和<代码> ->代码>访问它所包含的指针成员。

符号最初来自C.good点:我把问题改成用C代替C++。格雷戈和A:这可能不是复制品。这个问题问为什么
p->x
是必要的,因为它只是
(*p).x
的语法糖。这个问题问为什么我们不能只使用<代码> P.x/Cuth>而不是<代码> p> x 。重复的,也必须考虑当附加级别的间接涉及时会发生什么:是否允许编译器在使用<代码> >代码> >代码>结构> <代码>任意深度指针。或者将其限制为最多一个间接层次?这两种解决方案对我来说都不是“正确的”…好吧,因为这(只有
->
)是在某些语言中实现的,这是可能的。似乎人们从C语言或C++中发现这些语言,使它们难以区分。参见SBI:True。然而,在大多数其他语言中,你不必真正处理多个间接的方向,我们有C和C++处理的乐趣(可能有例外,但我的头脑中的语言不)。当然,对。这些语言在其他方面也常常模糊了引用和被引用对象之间的区别。我只是指出C和C++的方式并不是“唯一正确的方式”,而且似乎只有我们才这么做,因为我们已经做了这么长时间了。为什么这个被否决了?它没有回答问题。@很好,事实上,你编辑了你的问题!
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