2010-11-06 90 views

回答

24

这是通过指针访问对象的成员函数或者成员变量,而不是一个常规的变量或参考。

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

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

但是,如果你有一个指针工作,你需要使用->操作:

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; 
23

a->b表示(*a).b

如果a指针a->b是构件b其中a点。

a也可以是一个像指针一样的指针(如vector<bool>的存根)覆盖运算符。

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

+0

除非它是运算符重载的类。 – 2010-11-06 14:14:36

+3

有这么多投票,这是一个耻辱,因为超载运营商是常见的,也是答案的重要部分。 – 2010-11-06 14:21:35

+3

我不知道(* a).b是什么意思。 – 2010-11-06 14:23:02

0

->运算符,它是专门应用于指针,需要以获得规定的字段或由指针引用的对象的方法。 (这也适用于structs仅限于他们的领域)

如果你有一个变量ptr声明为指针,你可以把它想象成(*ptr).field

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

+0

它不是专门用于指针,因为它可以作为类运算符重载。共享指针组件的功能与标准库中的容器迭代器一样。 – 2010-11-06 14:02:36

+0

是的,当然它可以被重载(作为每个操作符),但我猜想OP需要知道操作符的原始语义。 – Jack 2010-11-06 14:06:37

5

X-> Y可以意味着两两件事。如果x是一个指针,那么它表示由x指向的对象的成员y。 如果x是一个运算符 - >()被重载的对象,那么它意味着x.operator - >()。适用于(a)所有的指针类型

+0

否。如果x是一个带有operator-> overloaded的对象,则表示x.operator- >(),如果返回值也支持operator->,则表示x.operator - >()。operator - >()。运算符 - >不带任何参数。 – Puppy 2010-11-06 14:04:59

+0

我的不好,现在编辑 – 2010-11-06 14:09:26

10
  1. 访问运算符,(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; 
    }; 
    
+0

+1为返回类型。 – Puppy 2010-11-06 14:03:30

+0

不要忘记#2适用于所有推导的返回类型(lambdas和非lambda)。 – 2010-11-06 14:22:28

+0

添加到abve枚举。不知道为什么代码示例没有正确显示,如果有人知道发生了什么,请随时更正格式。 – 2010-11-07 11:26:54