可能重复:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
为什么C语言有“->”和“.”的区别?
我知道成员运算符(.)和指针成员运算符(->)之间的区别。
为什么C语言的设计者会创建一个不同的操作符来访问这个?为什么编译器不能自己找出来呢?
如果你总是使用“.”,是否存在任何情况不明确你是指成员还是指指针成员?
编辑:我不是在寻找“(*a).b”语法。我想知道为什么设计者不允许您使用“a.b”而不是“a->b”?
可能重复:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
为什么C语言有“->”和“.”的区别?
我知道成员运算符(.)和指针成员运算符(->)之间的区别。
为什么C语言的设计者会创建一个不同的操作符来访问这个?为什么编译器不能自己找出来呢?
如果你总是使用“.”,是否存在任何情况不明确你是指成员还是指指针成员?
编辑:我不是在寻找“(*a).b”语法。我想知道为什么设计者不允许您使用“a.b”而不是“a->b”?
你真的希望编译器“自己想出来”吗?如果是这样,那么以下内容将会得到相同的结果(假设p
是指向具有成员x
的结构体的指针):
(*p).x;
p.x
int* p;
int i = p; // should dereferencing be implicit here as well?
我认为这会比有两个分开的运算符更加混乱。
同时,拥有两个运算符可以帮助您跟踪您有多少层间接引用。尽管 ->
运算符在这方面并不是必需的,因为 p->x
等效于 (*p).x
,但它确实使代码更清晰、更易读。
.
用于 ->
和 ::
),这是可行的。而且似乎从那些语言转到 C 或 C++ 的人会觉得区分它们很困惑。 - sbiclass 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
当你拥有一种本质上旨在成为“可移植汇编器”的语言时,你不会试图向用户隐藏实现细节。当然,编译器可以确定在表达式a.b
中所涉及的a
是一个指针。你能吗?可靠地?在复杂混乱的代码中始终如一?而且你难道不能想象出一种情况,在这种情况下,无法快速注意到a
是一个指针可能会成为一个问题吗?
停止以“难以编写”为思考方式,开始以“易于阅读”为思考方式。(是的,我知道。这与整个C程序员神话背道而驰!)你将比编写代码多几个数量级地阅读代码。
C++ 允许您重载 ->
运算符。当您有一个智能指针类,例如 std::auto_ptr
时,同一变量可能同时支持 .
和 ->
,您可以使用 .
访问 auto_ptr
的成员,使用 ->
访问其包含的指针的成员。
(*a).b
和 a->b
是一样的。
无论是fo->bar
还是(*fo).bar
都是相同的操作!
语言只是提供了一个间接访问运算符,即箭头(->
),并将其视为单个符号。
-> 运算符只是通过指针引用对象的方法或成员变量更加简便的方法,而不必使用 (*p).member 或 (*p).method 这样的方式。
例如:
MyClass *MyObj;
MyObj->method(); 比 (*MyObj).method(); 更容易阅读和理解。
p->x
,考虑到它只是(*p).x
的语法糖。而这个问题问为什么我们不能只使用p.x
而不是p->x
。 - James McNellisgrep
命令。 :) - Greg Hewgill