【问题标题】:Why do pointers use -> instead of .? [duplicate]为什么指针使用 -> 而不是 .? [复制]
【发布时间】:2010-01-07 17:36:23
【问题描述】:

可能重复:
Why does C have a distinction between -> and . ?

假设我有这个结构:

struct movies
{
    string title;
    int year;
} my_movie, *ptrMovie;

现在我像这样访问my_moviemy_movie.year = 1999;
现在要访问指针,我必须这样做:ptrMovie->year = 1999;

为什么指针使用-> 运算符而普通数据类型使用. 运算符?他们有什么理由不能同时使用. 运算符?

【问题讨论】:

  • ... 因为它会令人困惑?不同的操作 -> 不同的操作符。
  • 糟糕...当我搜索它时它没有出现。对不起。
  • 我认为“重复”是一个 C 问题,而不是 C++ 问题,但 C++ 是语法的原因很大程度上是因为 C 就是这样做的。不过,另一个问题中的一些答案也涉及 C++ 兼容性。
  • 公平地说,如果我们看 C++ 而不是 C,另一个原因是 operator-> 需要与运算符区分开来。用于实现智能指针类(operator-> 必须是可重载的,以便通过指针传递,但 operator. 必须是独立的且不可重载,以允许访问智能指针对象本身的方法)。

标签: c++ pointers struct


【解决方案1】:

.运算符访问结构的成员,并且只能对结构变量进行操作。 如果要对指针执行此操作,首先需要取消引用指针(使用*),然后访问成员(使用.)。类似的东西

(*ptrMovie).year = 1999

-> 运算符是对此的简写。

【讨论】:

  • ". 运算符访问结构的成员,只能对结构变量进行操作。"???真的吗?类成员变量呢?
  • 我的立场是正确的。 OP 提到了结构,我将我的反应限制在 C(它没有类)。
  • @Noufal,是的,但问题被标记为 C++,它同时具有结构和类
  • 格伦,结构和类在定义之外没有区别。
  • 在 C++ 中,结构是一种类。 . 适用于所有类型的类,包括结构和联合。
【解决方案2】:

. 运算符仅对结构或类有效。指针不是结构或类,因此您需要取消引用指针以获取它指向的结构/类,如下所示

(*ptrMovie).year

成员运算符. 的优先级高于解引用运算符*,因此需要将解引用操作括在括号中。或者你可以这样做

ptrMovie->year

两者是等价的。 '->' 运算符是取消引用指针然后访问结构成员的快捷方式。在我看来,它的打字更少,使用起来也更好。显然大多数人都同意我的观点,因为这是在我见过的大多数代码中从指向结构的指针访问结构成员的标准方法。当您必须执行多个间接级别时,您会特别欣赏这种差异:

ptrToStruct->memberPtr->subMemberPtr->subsubPtr->subsubsubPtr->x

(*(*(*(*(ptrToStruct).memberPtr).subMemberPtr).subsubPtr).subsubsubPtr).x

这两个语句是等效的,但第一个更容易使用。

【讨论】:

  • ". 仅对结构有效"???真的吗?上课怎么样?
  • 除了默认保护(结构为公共,类为私有)外,类和结构在 C++ 中是可以互换的。
  • @KeithB,是的,我知道。然而,答案暗示并非如此。也许我的评论在试图澄清这一点时并不是特别清楚
  • 是的......我应该说“结构或类”,即使它们在 C++ 中的功能相同。
  • union 怎么样?事实上,它适用于所有类(由类键classstructunion 引入的类型)。
【解决方案3】:

如果他们都使用 .您如何区分指针和实际对象? 对我来说:

->

让我想起了一个指向某物的箭头,所以我觉得使用 -> 很棒。

使用myPointer-> 代替输入(*myPointer). 更简单

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 2013-09-13
    • 2013-02-09
    • 1970-01-01
    • 2010-10-13
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多