91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++函數指針的用法有哪些

發布時間:2022-01-07 17:49:40 來源:億速云 閱讀:121 作者:iii 欄目:開發技術

這篇“C++函數指針的用法有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++函數指針的用法有哪些”文章吧。

    C++函數指針詳細理解

    函數指針初識

    函數指針是指向函數的指針,并不等于函數,它能夠執行函數的操作,可以跟指針變量一起來理解,其基本聲明格式為:

    type (*ptrname)(形參列表);

    例子,聲明一個比較兩個字符串大小的函數指針

    bool (*cp)(const string s1, const string s2);

    需要注意的是,不要去掉括號!!!如果去掉括號,含義就變成了返回一個bool指針的函數的聲明!

    函數指針指向函數類型

    在使用函數指針時,函數指針可以發揮與函數相同的功效,即也可以起到執行任務的作用,但是函數指針需要初始化,而且不存在函數指針類型的轉換,在進行初始化的時候,函數指針可以被賦值為nullptr或常量NULL,或者指向一個函數,但是,指向這個函數時,需要有嚴格的要求,它需要嚴格按照兩者的返回類型,形參列表相對應

    例子

    // 兩個示例函數
    bool compareLength(const string s1, const string s2){
        //當s1的長度大于s2的長度,返回true,否則返回false
        return s1.size() > s2.size()?true:false;
    }
    
    int getLength(const string s1){
        //返回字符串的長度
        return s1.size();
    }
    
    // 初始化前面定義的cp函數指針
    cp = nullptr;  // 正確,初始化為空
    cp = NULL;     // 正確,初始化為空常量NULL
    cp = compareLength;  // 正確,函數的返回形式和形參列表和類型都是一樣的
    cp = getLength;		 // 錯誤,返回類型和形參列表不一樣

    使用函數

    接著上面的思路,函數調用的方式可以這樣寫

    // 函數指針調用函數
    cp(s1, s2);
    
    // 調用2
    (*cp)(s1, s2);
    
    // 函數調用,與cp一樣
    compareLength(s1, s2);

    函數指針作為形參使用

    可以將函數或者函數指針作為某一個函數的形式參數傳入并使用,如C++11的thread頭文件線程的構造函數中急需要傳遞一個函數指針的實例

    #include<thread>
    
    std::thread t(函數指針, ..Args);

    其聲明定義形式如下,比如將上面定義的函數或函數指針傳入一個新的函數中,作為兩者的比較依據

    int packageFunc(const string &s1, const string &s2, bool comp(const string &s1, const string &s2)){
        if(comp(s1, s2)){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }
    
    // 或者以指針的形式來聲明函數形參, 這種定義與上面那種定義是等價的
    int packageFunc(const string &s1, const string &s2, bool (*cp)(const string &, const string &));

    考慮到這樣的形式參數聲明太過冗長,可以使用typedef和decltype來簡化操作,比如上面代碼又可以這樣寫

    typedef bool Func(const string&, const string&);
    int packageFunc(const string &s1, const string &s1, Func);
    
    // 或者寫成這樣,這條語句與上面的typedef聲明語句等價
    typedef decltype(compareLength) Func2;
    int packageFunc(const string &s1, const string &s1, Func2)

    或者定義成函數指針的形式

    typedef bool (*fp)(const string &, const string &);
    int packageFunc(const string s1, const string s2, fp);
    
    // 定義成函數指針的形式,與上面的聲明等價
    typedef decltype(compareLength) *fp_ptr;
    int packageFunc(const string s1, const string s2, fp_ptr);

    或者還可以這樣寫

    using fp = bool (*)(const string &, const string &);

    typedef:是自定義數據類型的聲名符,可以用于定義自己的數據類型,與using有相似的地方

    decltype:它返回一個函數類型,即對傳入的函數類型進行處理,返回一個返回類型和形參定義都與傳入函數相等的函數類型,但是它無法將返回的函數類型自動轉變為函數指針,所以再需要函數指針是要加*

    函數指針作為返回值

    函數指針也可作為返回值,比如傳統的Unix進程間通過signal通信的方式的signal函數就會返回函數指針類型,如

    #include<signal.h>
    
    函數指針 = signal(SIGABRT, 函數句柄);
    // 其返回的就是一個函數指針,即上一個與這個信號綁定的函數句柄,如果是第一次綁定返回NULL

    但是函數類型不可,依據上面的簡要聲明,

    using F = int(int *, int);
    using PF = int (*)(int*, int);
    
    PF f1(int); // 正確,PF為指函數的指針
    F  f2(int); // 錯誤,F為函數類型
    F* f3(int); // 正確,顯式的制定了函數返回函數指針的形式

    也可以直接聲明,但是不太好理解,會導致代碼的可讀性差,不建議這樣做

    int (*f1(int))(int*, int);

    還可以以后置形式聲明一個函數返回一個函數指針類型

    auto f1(int) -> int (*)(int*, int);

    練習

    編寫函數的聲明,令其接收兩個int形參并且返回類型也是int;然后聲明一個vector對象,零其元素執行函數的指針

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    int func1(int a, int b){
        // 加法
        return a+b;
    }
    
    int func2(int a, int b){
        // 減法
        return a - b;
    }
    
    int main(int argc, char *argv[]){
        decltype(func1) *p1 = func1, *p2 = func2;
        vector<decltype(func1)*> s = {p1,p2};
        int a = 10,b = 5;
        printf("add:[%d + %d = %d]\n", a, b, s[1](a,b));
        printf("sub:[%d - %d = %d]\n", a, b, s[1](a,b));
    }
    add:[10 + 5 = 5]sub:[10 - 5 = 5]

    以上就是關于“C++函數指針的用法有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    西乌珠穆沁旗| 依安县| 陆良县| 兴化市| 于田县| 屏边| 太谷县| 德江县| 武山县| 巍山| 蒲江县| 长兴县| 昌图县| 泽普县| 通山县| 娱乐| 安仁县| 东城区| 龙门县| 新巴尔虎右旗| 昌江| 大余县| 册亨县| 清原| 涟水县| 大悟县| 荥经县| 盐津县| 合阳县| 宜兰市| 青海省| 阿图什市| 永胜县| 阿克苏市| 安顺市| 阳朔县| 邯郸县| 女性| 高台县| 宁武县| 东兰县|