【问题标题】:What does -> mean in C++? [duplicate]-> 在 C++ 中是什么意思? [复制]
【发布时间】:2011-05-06 00:42:49
【问题描述】:

可能的重复:
What is the difference between the dot (.) operator and -> in C++?
What is the arrow operator (->) synonym for in C++?

标题说明了一切。

-> 在 C++ 中是什么意思?

【问题讨论】:

  • 你熟悉哪种语言?
  • 不确定您对 "->" 的确切含义。它只是一个用于访问成员变量和函数的东西。希望这会有所帮助。

标签: c++


【解决方案1】:

它是通过指针访问对象的成员函数或成员变量,而不是常规变量或引用。

例如:对于常规变量或引用,您使用. 运算符来访问成员函数或成员变量。

std::string s = "abc";
std::cout << s.length() << std::endl;

但如果您使用的是指针,则需要使用-&gt; 运算符:

std::string* s = new std::string("abc");
std::cout << s->length() << std::endl;

它也可以被重载以执行特定对象类型的特定功能。像 shared_ptrunique_ptr 这样的智能指针,以及 STL 容器迭代器,都会重载此运算符以模仿原生指针语义。

例如:

std::map<int, int>::iterator it = mymap.begin(), end = mymap.end();
for (; it != end; ++it)
    std::cout << it->first << std::endl;

【讨论】:

    【解决方案2】:

    a-&gt;b 表示(*a).b

    如果a 是一个指针,那么a-&gt;b 就是ba 指向的成员。

    a 也可以是类似对象的指针(如 vector&lt;bool&gt; 的存根)覆盖运算符。

    (如果你不知道指针是什么,那你还有一个问题)

    【讨论】:

    • 除非它是一个运算符重载的类。
    • 很遗憾有这么多选票,因为重载运算符很常见,也是答案的重要部分。
    • 我不知道 (*a).b 是什么意思。
    • @Steve:任何将a.operator-&gt;() 重载为不同于&amp;*a 的人都是邪恶的。
    • 史蒂夫,我也同意。虽然我很欣赏 J-16 SDiZ 的努力,但似乎所有的选票都可能来自那些已经清楚地了解答案的人。我很可能会接受更具描述性的答案。
    【解决方案3】:
    1. 访问运算符适用于 (a) 所有指针类型,(b) 所有显式重载此运算符的类型
    2. 本地 lambda 表达式的返回类型的介绍者:

      std::vector<MyType> seq;
      // fill with instances...  
      std::sort(seq.begin(), seq.end(),
                  [] (const MyType& a, const MyType& b) -> bool {
                      return a.Content < b.Content;
                  });
      
    3. 结合重新发明的auto引入函数的尾随返回类型:

      struct MyType {
          // declares a member function returning std::string
          auto foo(int) -> std::string;
      };
      

    【讨论】:

    • +1 返回类型。
    • 别忘了 #2 适用于所有推导的返回类型(lambdas 和非 lambdas)。
    • 添加到上面的枚举中。不知道为什么代码示例没有正确显示,如果有人知道发生了什么,请随时更正格式。
    • 在一个列表元素之后,代码必须缩进 8 个空格而不是 4 个。我还从 lambda 中删除了尾随返回类型,它是推导出来的。
    • @GMan 谢谢,但我把它加回来了,否则这与 OP 的问题完全无关:) 我不能(很快)想出一个无法推断其返回类型的 lambda,以微不足道为榜样……
    【解决方案4】:

    x->y 可能意味着两件事。如果 x 是指针,则表示 x 指向的对象的成员 y。 如果 x 是重载了 operator->() 的对象,则表示 x.operator->()。

    【讨论】:

    • 没有。如果x是重载了operator->的对象,则表示x.operator->(),如果返回值也支持operator->,则表示x.operator->().operator->()。运算符-> 不带参数。
    【解决方案5】:

    【讨论】:

      【解决方案6】:

      需要-&gt;运算符,专门应用于指针,用于获取指针引用的对象的指定字段或方法。 (这也适用于structs,仅适用于他们的领域)

      如果您将变量ptr 声明为指针,您可以将其视为(*ptr).field

      我添加的一个边节点只是为了让迂腐的人开心:几乎每个操作员都可以通过为您的类重载操作符来定义不同的操作符语义。

      【讨论】:

      • 它不适用于指针,因为它可以作为类运算符重载。共享指针组件和标准库中容器的迭代器一样。
      • 是的,当然它可以被重载(作为每个运算符)但我猜 OP 需要知道运算符的原始语义..
      【解决方案7】:

      a 指向的对象的成员 b a->b

      【讨论】:

        猜你喜欢
        • 2019-09-12
        • 2015-06-25
        • 2019-12-08
        • 2013-02-12
        • 2011-06-10
        • 2014-02-02
        • 2014-06-25
        • 2014-11-08
        • 2021-05-17
        相关资源
        最近更新 更多