2012-04-11 388 views
2

我可能有點緊張,但無法理解下面的行是什麼?瞭解C++中的運算符過載

class background_task 
{ 
    public: 
    void operator()() const 
    { 
     do_something(); 
     do_something_else(); 
    } 
}; 

background_task f; 
std::thread my_thread(f); 
  1. 我認識一個線程(名爲my_thread)創建它調用對象background_task類的f但當在background_task類功能operator()其實叫什麼名字?

  2. 爲什麼要重載函數操作符?我知道這是C++ 101或非常基本的,但我仍然無法掌握它,所以我應該參考哪些書籍來了解更多關於這些C++主題的內容。

+1

這不是關於[運算符重載](http://stackoverflow.com/q/4421706/1025391),而是關於C++函子。看到這篇文章:http://stackoverflow.com/a/356993/1025391爲您的問題的詳細答案。 – moooeeeep 2012-04-11 17:44:36

+1

別擔心;這不是C++ 101.介紹性的C++類當然不會涵蓋線程,可能不會涵蓋自定義函數調用操作符,甚至可能不包括編寫自己的類。 – 2012-04-11 18:30:13

回答

2

operator()()

class background_task 
{ 
public: 
void operator()() const 
{ 
    do_something(); 
    do_something_else(); 
} 
}; 

這個定義意味着你可以實例化一個background_task並調用它(沒有在這種情況下,任何參數)。這使得它成爲一個「可調用實體」:

background_task f; 
f(); // calls foo::operator()(), i.e calls do_something() and do_something_else(). 

至於線程,它需要一個可調用實體不帶參數,所以傳遞一個background_task的實例罰款。如果background_task沒有贖回以下不會編譯:

background_task f; 
std::thread my_thread(f); 

std::thread構造,您還可以通過調用實體的參數,如果有參數,因此,例如

class background_task 
{ 
public: 
void operator()(double x) const 
{ 
    // do something with x, if you want 
    do_something(); 
    do_something_else(); 
} 
}; 

會與

background_task f; 
std::thread my_thread(f, 3.1416); 

在內部,線程將執行相當於調用f(3.1416)。

編輯:本來我聲稱沒有超載涉及。這並不完全清楚,所以我重新回答了我的答案。

+0

好吧,雖然它在技術上是錯誤的,但將慣例操作符實現稱爲「操作符重載」似乎是常見做法。可悲的是,口語並不總是有意義的。 – bitmask 2012-04-11 17:51:30

+0

@bitmask現在你讓我思考。如果你認爲你在這種情況下重載一個運算符void(void),而不是超載已經爲特定類型定義的東西,那麼它可能是超載了的...... – juanchopanza 2012-04-11 17:55:39

+0

第一個隱含參數('this')總是確定要調用的函數。我不會說'void X :: foo()'和'void Y :: foo()'是'foo'的重載,儘管它們具有相同的名稱並且僅在(邏輯)參數中有所不同。 'void operator()()const'也適用於同樣的推理。但我很挑剔:) – bitmask 2012-04-11 18:02:18

1
  1. 線程對象std::thread(f, a, b, c)使對象f的副本(我們稱之爲copy_of_f),以及新的執行上下文的入口點是呼叫copy_of_f(a, b, c)(或更冗長,copy_of_f.operator()(a, b, c))。

  2. 目的f必須是調用實體,這意味着表達f(a, b, c)必須合理。

  3. 專門針對C++ 11的書籍仍在編寫過程中。今年晚些時候請留意Stroustrup,Meyers等人。直到那時,互聯網可能是你最好的選擇。