2010-11-06 88 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