最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中函數(shù)調(diào)用運算符重載的實現(xiàn)

 更新時間:2026年02月03日 08:57:44   作者:挖礦大亨  
在 C++ 中,函數(shù)調(diào)用運算符的重載是一種特殊的運算符重載方式,允許自定義類的對象像函數(shù)一樣被調(diào)用,本文就來詳細的介紹一下c++中函數(shù)調(diào)用運算符重載的實現(xiàn),感興趣的可以了解一下

在 C++ 中,函數(shù)調(diào)用運算符 () 的重載是一種特殊的運算符重載方式,允許自定義類的對象像函數(shù)一樣被調(diào)用(這類對象也被稱為 “函數(shù)對象” 或 “仿函數(shù)”)。函數(shù)調(diào)用運算符重載是實現(xiàn) STL 算法(如sort、for_each)自定義邏輯的核心手段,也是現(xiàn)代 C++ 中 lambda 表達式的底層實現(xiàn)基礎(chǔ)。

一、核心規(guī)則

1、重載方式:只能作為類的成員函數(shù)重載(全局函數(shù)無法重載())。
2、返回值:無固定要求(可返回任意類型,如int、bool、自定義類型,也可void)。
3、參數(shù)列表:支持任意數(shù)量、任意類型的參數(shù)(可重載多個版本,區(qū)分參數(shù)類型 / 個數(shù))。
4、const 修飾:若函數(shù)對象無需修改自身狀態(tài),建議加const(保證常量對象可調(diào)用)。
5、語義:調(diào)用對象(參數(shù))等價于調(diào)用對象.operator()(參數(shù))。

二、基礎(chǔ)示例:簡單仿函數(shù)

先實現(xiàn)一個最基礎(chǔ)的函數(shù)調(diào)用運算符重載,讓對象能像函數(shù)一樣執(zhí)行邏輯:

#include <iostream>
using namespace std;

// 定義一個可調(diào)用的類(仿函數(shù))
class Add {
public:
    // 重載函數(shù)調(diào)用運算符:接收兩個int,返回和
    int operator()(int a, int b) const {
        return a + b;
    }
};

int main() {
    // 創(chuàng)建函數(shù)對象
    Add add_obj;
    
    // 像調(diào)用函數(shù)一樣調(diào)用對象(等價于 add_obj.operator()(3,5))
    int result = add_obj(3, 5);
    cout << "3 + 5 = " << result << endl; // 輸出:3 + 5 = 8

    // 也可直接創(chuàng)建臨時對象并調(diào)用
    cout << "10 + 20 = " << Add()(10, 20) << endl; // 輸出:10 + 20 = 30

    return 0;
}

三、進階示例:帶狀態(tài)的仿函數(shù)

函數(shù)對象的核心優(yōu)勢是可保存狀態(tài)(成員變量),這是普通函數(shù)無法做到的。例如實現(xiàn)一個 “累加器”:

#include <iostream>
using namespace std;

class Accumulator {
private:
    int total = 0; // 保存累加狀態(tài)
public:
    // 重載1:接收int,累加并返回當前總和
    int operator()(int num) {
        total += num;
        return total;
    }

    // 重載2:無參版本,返回當前總和
    int operator()() const {
        return total;
    }

    // 重置狀態(tài)
    void reset() {
        total = 0;
    }
};

int main() {
    Accumulator acc;
    
    // 多次調(diào)用,累計狀態(tài)
    acc(10);  // total = 10
    acc(20);  // total = 30
    acc(30);  // total = 60

    cout << "累計總和:" << acc() << endl; // 輸出:60

    acc.reset();
    acc(5);
    cout << "重置后累計:" << acc() << endl; // 輸出:5

    return 0;
}

四、實戰(zhàn)場景:配合 STL 算法使用

函數(shù)調(diào)用運算符重載最常用的場景是為 STL 算法提供自定義邏輯(如排序、遍歷、篩選)。

示例 1:自定義排序規(guī)則

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 按年齡降序排序的仿函數(shù)
class CompareAgeDesc {
public:
    // 假設(shè)元素是pair<姓名, 年齡>
    bool operator()(const pair<string, int>& a, const pair<string, int>& b) const {
        return a.second > b.second; // 降序:a的年齡 > b的年齡則a排在前面
    }
};

int main() {
    vector<pair<string, int>> students = {
        {"張三", 20}, {"李四", 25}, {"王五", 18}
    };

    // 使用仿函數(shù)作為排序規(guī)則
    sort(students.begin(), students.end(), CompareAgeDesc());

    // 輸出排序結(jié)果
    for (const auto& s : students) {
        cout << s.first << ":" << s.second << "歲" << endl;
    }

    return 0;
}

示例 2:遍歷容器并累加

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 累加容器中元素的仿函數(shù)
class SumInt {
private:
    int sum = 0;
public:
    // 重載():接收int,累加
    void operator()(int num) {
        sum += num;
    }

    // 獲取累加結(jié)果
    int getSum() const {
        return sum;
    }
};

int main() {
    vector<int> nums = {1, 2, 3, 4, 5};

    // 用for_each遍歷,傳入仿函數(shù)
    SumInt sum_obj = for_each(nums.begin(), nums.end(), SumInt());

    cout << "數(shù)組總和:" << sum_obj.getSum() << endl; // 輸出:15

    return 0;
}

五、關(guān)鍵注意事項

1、與普通函數(shù)的區(qū)別:

函數(shù)對象可保存狀態(tài)(成員變量),普通函數(shù)只能通過全局 / 靜態(tài)變量實現(xiàn)(不推薦);
函數(shù)對象支持重載(多個operator()版本,區(qū)分參數(shù)),普通函數(shù)重載需手動寫多個函數(shù)名。

2、const 正確性:

若仿函數(shù)無需修改自身狀態(tài),務必給operator()加const(如排序規(guī)則的仿函數(shù));
加const后,常量對象也能調(diào)用該運算符。

3、與 lambda 表達式的關(guān)系:

C++11 后的 lambda 表達式本質(zhì)是編譯器自動生成的 “匿名仿函數(shù)”;
上述排序示例用 lambda 簡化:

sort(students.begin(), students.end(), 
     [](const pair<string, int>& a, const pair<string, int>& b) {
         return a.second > b.second;
     });

4、重載多個版本:

可根據(jù)參數(shù)類型 / 個數(shù)重載多個operator(),滿足不同調(diào)用場景:

class Calc {
public:
    int operator()(int a, int b) const { return a + b; }
    double operator()(double a, double b) const { return a * b; }
    int operator()(int a) const { return a * 2; }
};

// 調(diào)用
Calc calc;
cout << calc(3,5) << endl;    // 8(int加法)
cout << calc(2.5, 4.0) << endl;// 10.0(double乘法)
cout << calc(6) << endl;       // 12(int翻倍)

5、不可重載為全局函數(shù):

operator() 是成員函數(shù)專屬的重載運算符,全局函數(shù)無法重載(因為對象()的語法要求左操作數(shù)是類對象)。

六、總結(jié)

函數(shù)調(diào)用運算符重載的核心價值是:
讓類對象擁有 “函數(shù)行為”,兼具函數(shù)的靈活性和類的狀態(tài)管理能力;
是 STL 算法自定義邏輯的核心手段,也是 lambda 表達式的底層支撐;
重載時需注意const修飾(無狀態(tài)時必加),并根據(jù)場景設(shè)計參數(shù)和返回值。
相比普通函數(shù),函數(shù)對象(仿函數(shù))在需要 “帶狀態(tài)的函數(shù)邏輯” 或 “重載不同參數(shù)的函數(shù)行為” 時,優(yōu)勢尤為明顯。

到此這篇關(guān)于c++中函數(shù)調(diào)用運算符重載的實現(xiàn)的文章就介紹到這了,更多相關(guān)c++ 函數(shù)調(diào)用運算符重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)圖書管理系統(tǒng)源碼

    C++實現(xiàn)圖書管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 利用C語言實現(xiàn)簡單三子棋游戲

    利用C語言實現(xiàn)簡單三子棋游戲

    這篇文章主要為大家詳細介紹了利用C語言實現(xiàn)簡單三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 實例講解在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用

    實例講解在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用

    這篇文章主要介紹了在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用,是C++函數(shù)入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C++中的單例模式介紹

    C++中的單例模式介紹

    單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設(shè)計模式。其意圖是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享
    2013-03-03
  • C++實現(xiàn)快速排序(Quicksort)算法

    C++實現(xiàn)快速排序(Quicksort)算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)快速排序(Quicksort)算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 一文詳解C++中的智能指針避坑指南

    一文詳解C++中的智能指針避坑指南

    你以為將new替換為make_shared就萬事大吉嗎,真相是智能指針的陷阱比手動管理更隱蔽更危險,本文將深入剖析循環(huán)引用,性能陷阱和線程安全,希望對大家有所幫助
    2025-12-12
  • 介紹C語言程序中的注釋等輔助語句如何使用

    介紹C語言程序中的注釋等輔助語句如何使用

    C語言中分為單行注釋和多行注釋:單行注釋?以?//?開始的這一行文本,可能不被編譯器所支持;多行注釋從?/*?到?*/之間的所有文本,不支持嵌套,下面讓我們詳細來了解
    2022-04-04
  • C語言實現(xiàn)掃雷游戲簡易版

    C語言實現(xiàn)掃雷游戲簡易版

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲簡易版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)有向圖鄰接表的構(gòu)建

    C++實現(xiàn)有向圖鄰接表的構(gòu)建

    這篇文章主要為大家詳細介紹了C++實現(xiàn)有向圖鄰接表的構(gòu)建,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c語言中回調(diào)函數(shù)的使用以及實際作用詳析

    c語言中回調(diào)函數(shù)的使用以及實際作用詳析

    回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù),這篇文章主要給大家介紹了關(guān)于c語言中回調(diào)函數(shù)的使用以及實際作用的相關(guān)資料,需要的朋友可以參考下
    2021-07-07

最新評論

东丰县| 灌阳县| 富锦市| 固原市| 克东县| 禹城市| 瓮安县| 卓尼县| 新竹县| 明星| 环江| 玉溪市| 麦盖提县| 福州市| 宾阳县| 濮阳市| 亳州市| 平阳县| 西青区| 大厂| 图木舒克市| 阿拉善左旗| 怀柔区| 阿坝| 北碚区| 罗山县| 苗栗市| 渑池县| 岳西县| 嘉黎县| 临澧县| 论坛| 淳安县| 潞西市| 铅山县| 乐亭县| 英山县| 区。| 如东县| 会同县| 永昌县|