C ++中的Arrow Member运算符

时间:2012-10-23 03:53:59

标签: c++ pointers reference pass-by-reference

我很擅长使用C ++。我以前处理过Java和ActionScript,但现在我想学习这种强大的语言。由于C ++授予程序员显式使用指针的能力,因此我对使用箭头成员运算符感到困惑。这是我尝试编写的示例代码。

main.cpp中:

   #include <iostream>
   #include "Arrow.h"
   using namespace std;

   int main()
   {
        Arrow object;
        Arrow *pter = &object;

        object.printCrap(); //Using Dot Access
        pter->printCrap(); //Using Arrow Member Operator
        return 0;
   }

Arrow.cpp

   #include <iostream>
   #include "Arrow.h"
   using namespace std;

   Arrow::Arrow()
   {

   }

   void Arrow::printCrap(){
       cout << "Steak!" << endl;
   }

在上面的代码中,它所做的只是使用两种方法(点和箭头)打印牛排。

简而言之,在使用C ++编写实际应用程序时,何时使用箭头符号?由于我以前的编程经验,我习惯使用点符号,但箭头对我来说是全新的。

3 个答案:

答案 0 :(得分:5)

在C中,a->b恰好等同于(*a).b。引入“箭头”符号是为了方便;通过指针访问结构的成员是相当常见的,箭头表示法更容易编写/输入,通常也被认为更具可读性。

C ++也增加了另一个皱纹:operator-> / struct可以重载class。虽然相当不寻常,但这样做对于智能指针类来说很常见(几乎是必需的)。

这本身并不常见:C ++允许绝大多数运算符被重载(尽管有些应该,例如operator&&operator||和{ {1}})。

不寻常的是如何解释重载的operator,。首先,虽然operator->看起来像a->b是二元运算符,但当你在C ++中重载它时,它被视为一元运算符,因此正确的签名是->,而不是T::operator()或者那个订单上的东西。

结果也有些异常。假设T::operator(U)是某种类型的对象,其重载foooperator->被解释为foo->bar。反过来,这会限制重载(f.operator->())->bar的返回类型。具体来说,它必须返回另一个类的实例,它也会重载operator->(或对这样一个对象的引用),否则它必须返回一个指针。

在前一种情况下,一个看起来很简单的operator->实际上可能意味着“追逐”整个(任意长的)对象实例链,每个对象重载foo->bar,直到最后一个到达时可以引用名为operator->的成员。对于一个(不可否认的极端)例子,考虑一下:

bar

即使#include <iostream> class int_proxy { int val; public: int_proxy(): val(0) {} int_proxy &operator=(int n) { std::cout<<"int_proxy::operator= called\n"; val=n; return *this; } }; struct fubar { int_proxy bar; } instance; struct h { fubar *operator->() { std::cout<<"used h::operator->\n"; return &instance; } }; struct g { h operator->() { std::cout<<"used g::operator->\n"; return h(); } }; struct f { g operator->() { std::cout<<"Used f::operator->\n"; return g(); } }; int main() { f foo; foo->bar=1; } 看起来像是通过指针对成员的简单赋值,该程序实际上会产生以下输出:

foo->bar=1;

显然,在这种情况下,Used f::operator-> used g::operator-> used h::operator-> int_proxy::operator= called (甚至接近)等同于简单的foo->bar。从输出中可以明显看出,编译器生成“隐藏”代码,以遍历各种类中的整个重载(*foo).bar运算符系列,以便从->获取(指向)具有成员的内容名为foo(在这种情况下也是一个重载bar的类型,因此我们也可以看到赋值的输出。)

答案 1 :(得分:3)

好问题,

  

点(。)此运算符用于访问成员函数或   有时使用实例的类或结构的数据成员   该类/结构的变量。

object.function(); 
object.dataMember; //not a standard for class.
  

arrow( - &gt;)此运算符用于访问成员函数或   有时是类或结构的数据成员但使用指针   类/结构。

ptr->function();
ptr->datamember; //not a standard for class.

答案 2 :(得分:2)

- &gt; operator是一种调用被解除引用的指针的成员函数的方法。它也可以写成(* pter).printCap()。没有课程或书籍,C ++很难学习,所以我建议学习一门,这将是一次很棒的投资!