筆者這裡用乙個簡單的**片段來說明偽函式的實現和用法,及其優點。**示例如下:
class abs
public:
int operator()(int num)const;//這個操作符的過載是實現偽函式的關鍵
abs();
void setisopponent(bool isopponent);
private:
bool isopponent;
//關鍵方法
int abs::operator()(int num)const
else
return res;
}
abs::abs()
void abs::setisopponent(bool aisopponent)
我們可以看到,由於abs類實現了乙個"()"操作符,這樣就允許把這個類像函式一樣使用。
我們把這樣的類稱為函式物件,或稱做偽函式。
使用示例如下:
abs myabs;
myabs.setisopponent(true); //進行相反操作。
int value = myabs(-23); //這裡如同把myabs例項當作乙個函式來使用。
優點:使用仿函式就像使用乙個普通的函式一樣,但是它的實現可以訪問仿函式中所有的成員變數來進行通行;而普通函式若要通訊就只能依靠全域性變數了。
bjarne: 什麼是函式物件?
顧名思義,就是在某種方式上表現的象乙個函式的物件。典型的,它是指乙個類的例項,這個類定義了應用操作符operator()。
函式物件是比函式更加通用的概念,因為函式物件可以定義跨越多次呼叫的可持久的部分(類似靜態區域性變數),同時又能從物件的外面進行初始化和檢查(和靜態區域性變數不同)。例如:
class sum
operator int() const // 取得值
int operator()(int i) // 應用
};void f(vector v)
注意:乙個擁有應用操作符的函式物件可以被完美地內聯化(inline),因為它沒有涉及到任何指標,後者可能導致拒絕優化。與之形成對比的是,現有的優化器幾乎不能(或者完全不能?)將乙個通過函式指標的呼叫內聯化。
在標準庫中,函式物件被廣泛的使用以獲得彈性。
C 中什麼叫做函式模板?
所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表,這個函式型別就稱為函式模板。具體表現 模板定義,includeusing namespace std template t max t a,t a,t c int main int i1 8,i2 5 i...
Bjarne 什麼是函式物件?
顧名思義,就是在某種方式上表現得象乙個函式的物件。典型地,它是指乙個類的例項,這個類定義了應用操作符operator 函式物件是比函式更加通用的概念,因為函式物件可以定義跨越多次呼叫的可持久的部分 類似靜態區域性變數 同時又能夠從物件的外面進行初始化和檢查 和靜態區域性變數不同 例如 class s...
函式過載與函式重寫 有的書也叫做「覆蓋」)的區別
常考的題目。從定義上來說 過載 是指允許存在多個同名函式,而這些函式的參數列不同 或許引數個數不同,或許引數型別不同,或許兩者都不同 重寫 是指子類重新定義復類虛函式的方法。從實現原理上來說 過載 編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式 至少對於編譯器來...