2010-08-13 62 views
2

我有一個簡單的C++結構如下:這個C++結構體的含義是什麼?

// Functor for peak to decreasing intensity sorting 
struct cmp_decr_int2 
{ 
    bool operator() (peak2 a, peak2 b) 
    { 
     return a.int2 > b.int2; 
    } 
}; 

是有操作者的該樣品中的過載?

+0

對不起,我對此表示歉意 – ladyfafa 2010-08-13 02:55:46

+0

感謝編輯:) – ladyfafa 2010-08-13 02:56:03

+2

請注意,在C++中,'struct'只是一個'class',默認的輔助功能是'public'。這個問題不是特定於'struct',也不是答案。 – 2010-08-13 08:03:28

回答

0

C++中的結構只是具有public而不是private的默認訪問器的類。所以是的,那會有一個功能超載。

10

是的。 operator()被稱爲「函數調用」操作符,並允許對象可用,就像它是一個函數一樣。這樣的班級被稱爲「功能員」。

一個常見模式是使函子比較兩個事物的等式或關係,用於需要比較謂詞的任何事物。 (這一個可能是可用在std::map,例如這將有一個構件等cmp_decr_int2 compare;然後它可以在兩個事物之間具有比較的關係:if (compare(x, y)) /* x is less than y, by some metric */

通過比較它們int2這種特殊的結構順序2 peak2的成員。它可以更好地寫爲:

struct cmp_decr_int2 
{ 
    //      note const! vvvvv 
    bool operator() (peak2 a, peak2 b) const 
    { 
     return a.int2 > b.int2; 
    } 
}; 

的功能應該是const,因爲它不需要更改任何成員(有沒有改變。)const-correctness重要*

在許多情況下,這些仿函數。在參數本身爲const的上下文中使用,所以您應該按照示例中的值或通過常量引用採用參數。

除了當該類型是基本類型(float,unsigned int,double等)或小於void*時,您應該更喜歡通過const-reference傳值類型。在大多數情況下,那麼,您將通過常量引用:

struct cmp_decr_int2 
{ 
    // note const&: vvvvv  v vvvvv  v vvvvv 
    bool operator() (const peak2 & a, const peak2 & b) const 
    { 
     return a.int2 > b.int2; 
    } 
}; 

*如果這是在std::map用作謂語,例如,沒有const地圖將無法比較兩個而在const函數中。

+0

@GMan:謝謝 – ladyfafa 2010-08-13 03:06:25

+0

@Gman:+1,很好的回答。 – 2010-08-13 03:54:26

+1

如果peak2對象不是很小,參數也應該是const引用。 – 2010-08-13 08:01:51

0

C++中的結構是在這樣一類各種方式,除了默認的參數訪問public:而非private:。當定義類型的使用範圍非常狹窄時,比如在一個簡單函子的例子中,使用struct而不是class是一種常見的做法。

這個例子所做的是模擬一個函數指針的外觀,而沒有可能爲空的脆弱性。

operator()這裏的成員重載函數調用。當您嘗試執行如下操作時:

cmp_decr_int2 foo; 
foo(peek2(), peek2()); 

重載成員被調用。

+0

這對初學者來說非常詳細,真的有幫助! :) – ladyfafa 2010-08-13 03:06:07

0
#include <iostream> 
using namespace std; 

struct cmp_decr_int2 
{ 
    bool operator() (int a, int b) 
    { 
     return a > b; 
    } 

    bool operator() (int i) 
    { 
     return i > 0; 
    } 
}; 

int main() 
{ 
    cmp_decr_int2 a; 
    cout << a(1, 2) << endl; 
    cout << a(1) << endl; 
} 

是的,肯定可以超載的功能!這對我來說非常合適。

+0

@BT:謝謝!~~~ – ladyfafa 2010-08-13 03:09:58

0

$ 13.5。4個狀態 -

operator()應該是一個具有任意數量參數的非靜態成員函數。它可以有默認參數。它實現函數調用語法postfix-expression(expression-listopt),其中後綴表達式計算爲一個類對象,可能的空表達式列表匹配該類的operator()成員函數的參數列表。因此,如果存在T :: operator()(T1,T2,T3),則對於類型爲T的類對象x,將調用x(arg1,...)解釋爲x.operator()(arg1,...)並且如果運算符被重載解析機制(13.3.3)選爲最佳匹配函數。

因此,struct'cmp_decr_int2'肯定重載了operator()。

請注意,這也是C++中唯一可以攜帶可變數量參數的運算符。