2014-10-12 68 views
1

我是C++ 11線程的新手,在閱讀教程時,會看到一段代碼。C++中的operator()()是做什麼的?

#include <thread> 
#include <iostream> 
using namespace std; 

class background_task 
{ 
    public: 
    void operator()() const 
    { 
     cout<<"This is a new thread"; 
    } 
}; 

int main() 
{ 
    background_task f; 
    std::thread my_thread(f); 
    my_thread.join(); 
} 

輸出將是「這是新的線程」,但我不真正瞭解什麼是功能‘運算符()()const的’是什麼意思?在這種情況下,它的行爲與構造函數非常相似,是不是?

與C如何能++有一個這樣的語法?我使用搜索引擎搜索相關主題,但未找到任何結果。

謝謝先進。

+2

在C++中搜索「functor」 – P0W 2014-10-12 09:01:03

回答

3

這只是運算符重載,並沒有任何與C++ 11或支持多線程。重載運算符只是一個有趣名字的正常函數(這可能有點過於簡化,但對初學者來說這是一個很好的經驗法則)。

您的班級有一個函數名爲()。就這樣。 技術上,你可能也有一個名爲功能foofTwoParentheses

考慮一個簡單的例子:

#include <iostream> 

class Example 
{ 
public: 
    void operator()() { std::cout << "()"; } 
    void foo() { std::cout << "foo"; } 
    void TwoParentheses() { std::cout << "TwoParentheses"; } 
}; 

int main() 
{ 
    Example e; 
    e.operator()(); 
    e.foo(); 
    e.TwoParentheses(); 
} 

現在呼籲在這個例子中重載運算符就像main,拼寫出整個.operator()部分,是很沒有意義的,因爲重載運算符的目的是讓調用代碼簡單。你會改爲調用你的函數是這樣的:

int main() 
{ 
    Example e; 
    e(); 
} 

正如你可以看到,現在e();看起來完全一樣,如果你調用的函數。

這就是爲什麼operator()畢竟是一個特殊的名字。在模板中,可以使用operator()相同的語法處理對象。

考慮一下:

#include <iostream> 

class Example 
{ 
public: 
    void operator()() { std::cout << "Example.operator()\n"; } 
}; 

void function() { std::cout << "Function\n"; } 

template <class Operation> 
void t(Operation o) 
{ 
    o(); // operator() or "real" function 
} 

int main() 
{ 
    Example object; 
    t(object); 
    t(function); 
} 

這就是爲什麼operator()在C++泛型編程的一個重要功能,往往需要的原因。

+0

謝謝你,非常有用的評論 – xtiger 2014-10-13 02:01:03

7

void operator()()指與運營商的類的實例可以使用函數調用語法來調用,沒有返回值,並且不帶任何參數。例如:

background_task b; 

b(); // prints "This is a new thread" 

operator()的部分表示它是一個呼叫操作者,所述第二組空括號的()指示操作沒有參數。下面是具有兩個參數的示例和一個返回值:

struct add 
{ 
    int operator()(int a, int b) const { return a + b; } 
}; 

add a; 
int c = a(1, 2); // c initialized to 1+2 

注意,此語法預日期C++ 11。您可以在C++ 03中創建可調用類型(也稱爲函數)。與C++ 11的連接是std::thread構造函數期望可以在不帶參數的情況下調用某些東西。這可能是一個簡單的函數

void foo() {} 

靜態成員函數

struct foo { 
    static void bar() {} 
}; 

一類型如background_task的實例中,合適的拉姆達表達,的std::bind合適的調用,總之,只要是可以在沒有參數的情況下調用。

+0

非常有用的評論,謝謝:) – xtiger 2014-10-13 02:01:46

2

它無關,與C++ 11,它的功能調用超載運營。這意味着,如果你有一個像你這樣的類,你可以創建它的一個實例,並作爲函數使用:

int main() 
{ 
    background_task bt; 
    bt(); 
} 

以上main功能應該給予同樣的結果作爲您簡單的線程例子。

0

是操作過載。用戶爲()運算符提供了額外的用途。靜態多態的例子。它是對象的數控車牀編程的fearture

+1

這不是面向對象編程的一個特性,至少在C++中通常定義面向對象編程。面向對象的編程意味着運行時多態。 ** OOP =虛擬函數**運算符重載通常對沒有任何虛函數的類有意義,反之亦然。 – 2014-10-12 09:08:34