在C语言中,是否允许使用->
运算符代替.
运算符?它的可用性是否取决于我们使用的编译器?->
运算符是最新的C标准中可用的,还是来自C++标准?这两者有何不同?
在C语言中,是否允许使用->
运算符代替.
运算符?它的可用性是否取决于我们使用的编译器?->
运算符是最新的C标准中可用的,还是来自C++标准?这两者有何不同?
->
是可重载的,Bjarne 希望在 C++17 中也使 .
可重载,以便拥有类似于智能指针的智能引用。详见 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4477.pdf。 - bolov.
。 - Bathsheba->
可能是有用的。我最讨厌 Java 的一点是它不允许操作符重载。我发现与某些类(例如 BigInteger
)一起工作非常令人沮丧。 - Bathsheba->
在创建类似指针的类(比如 std::unique_ptr
)时确实非常有用。另一方面,当你拥有 x
时,你需要 某种形式 的保证能够访问成员变量 y
或对象 x
,因此必须保留一个无法重载的运算符。这个运算符就是 .
。 - Angew is no longer proud of SO*
、.
和->
。这很重要,因为.
和->
的优先级都是1,但*
的优先级是2。因此,*foo.bar
与foo->bar
不同,需要使用括号,例如(*foo).bar
。a->b
和(*a).b
是完全等价的,引入->
的原因是优先级——这样你就不必在(*a)
中输入括号。operator *
和operator ->
可以独立重载,因此不能再说a->b
和(*a).b
在所有情况下都是等价的。然而,当a
是内置指针类型时,它们仍然是100%等价的。->
操作符是 C 语言中的标准操作符。使用 .
和 ->
都可以访问结构体字段。在结构体变量上使用 .
,在结构体指针变量上使用 ->
。
struct foo {
int x;
int y;
}
struct foo f1;
f1.x = 1;
f1.y = 3;
struct foo *f2 = &f1;
printf("%d\n", f1.x); // 1
printf("%d\n", f2->x); // 1
x->y
是(*x).y
的简写。它从C语言一开始就可用。实际上,没有人会写(*x).y
。 - Jabberwocky->
被覆盖,如果我理解正确的话。 - berealc++
...好的,不再是了。 - bereal