" />

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

C++函數(shù)指針的用法詳解

 更新時(shí)間:2022年01月07日 16:15:49   作者:?jiǎn)柼?hào)小朋友  
這篇文章主要為大家介紹了C++函數(shù)指針的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

C++函數(shù)指針詳細(xì)理解

函數(shù)指針初識(shí)

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

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

例子,聲明一個(gè)比較兩個(gè)字符串大小的函數(shù)指針

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

需要注意的是,不要去掉括號(hào)!!!如果去掉括號(hào),含義就變成了返回一個(gè)bool指針的函數(shù)的聲明!

函數(shù)指針指向函數(shù)類型

在使用函數(shù)指針時(shí),函數(shù)指針可以發(fā)揮與函數(shù)相同的功效,即也可以起到執(zhí)行任務(wù)的作用,但是函數(shù)指針需要初始化,而且不存在函數(shù)指針類型的轉(zhuǎn)換,在進(jìn)行初始化的時(shí)候,函數(shù)指針可以被賦值為nullptr或常量NULL,或者指向一個(gè)函數(shù),但是,指向這個(gè)函數(shù)時(shí),需要有嚴(yán)格的要求,它需要嚴(yán)格按照兩者的返回類型,形參列表相對(duì)應(yīng)

例子

// 兩個(gè)示例函數(shù)
bool compareLength(const string s1, const string s2){
    //當(dāng)s1的長(zhǎng)度大于s2的長(zhǎng)度,返回true,否則返回false
    return s1.size() > s2.size()?true:false;
}

int getLength(const string s1){
    //返回字符串的長(zhǎng)度
    return s1.size();
}

// 初始化前面定義的cp函數(shù)指針
cp = nullptr;  // 正確,初始化為空
cp = NULL;     // 正確,初始化為空常量NULL
cp = compareLength;  // 正確,函數(shù)的返回形式和形參列表和類型都是一樣的
cp = getLength;		 // 錯(cuò)誤,返回類型和形參列表不一樣

使用函數(shù)

接著上面的思路,函數(shù)調(diào)用的方式可以這樣寫(xiě)

// 函數(shù)指針調(diào)用函數(shù)
cp(s1, s2);

// 調(diào)用2
(*cp)(s1, s2);

// 函數(shù)調(diào)用,與cp一樣
compareLength(s1, s2);

函數(shù)指針作為形參使用

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

#include<thread>

std::thread t(函數(shù)指針, ..Args);

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

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;
    }
}

// 或者以指針的形式來(lái)聲明函數(shù)形參, 這種定義與上面那種定義是等價(jià)的
int packageFunc(const string &s1, const string &s2, bool (*cp)(const string &, const string &));

考慮到這樣的形式參數(shù)聲明太過(guò)冗長(zhǎng),可以使用typedef和decltype來(lái)簡(jiǎn)化操作,比如上面代碼又可以這樣寫(xiě)

typedef bool Func(const string&, const string&);
int packageFunc(const string &s1, const string &s1, Func);

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

或者定義成函數(shù)指針的形式

typedef bool (*fp)(const string &, const string &);
int packageFunc(const string s1, const string s2, fp);

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

或者還可以這樣寫(xiě)

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

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

decltype:它返回一個(gè)函數(shù)類型,即對(duì)傳入的函數(shù)類型進(jìn)行處理,返回一個(gè)返回類型和形參定義都與傳入函數(shù)相等的函數(shù)類型,但是它無(wú)法將返回的函數(shù)類型自動(dòng)轉(zhuǎn)變?yōu)楹瘮?shù)指針,所以再需要函數(shù)指針是要加*號(hào)

函數(shù)指針作為返回值

函數(shù)指針也可作為返回值,比如傳統(tǒng)的Unix進(jìn)程間通過(guò)signal通信的方式的signal函數(shù)就會(huì)返回函數(shù)指針類型,如

#include<signal.h>

函數(shù)指針 = signal(SIGABRT, 函數(shù)句柄);
// 其返回的就是一個(gè)函數(shù)指針,即上一個(gè)與這個(gè)信號(hào)綁定的函數(shù)句柄,如果是第一次綁定返回NULL

但是函數(shù)類型不可,依據(jù)上面的簡(jiǎn)要聲明,

using F = int(int *, int);
using PF = int (*)(int*, int);

PF f1(int); // 正確,PF為指函數(shù)的指針
F  f2(int); // 錯(cuò)誤,F(xiàn)為函數(shù)類型
F* f3(int); // 正確,顯式的制定了函數(shù)返回函數(shù)指針的形式 

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

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

還可以以后置形式聲明一個(gè)函數(shù)返回一個(gè)函數(shù)指針類型

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

練習(xí)

編寫(xiě)函數(shù)的聲明,令其接收兩個(gè)int形參并且返回類型也是int;然后聲明一個(gè)vector對(duì)象,零其元素執(zhí)行函數(shù)的指針

#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]

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++代碼實(shí)現(xiàn)逆波蘭式

    C++代碼實(shí)現(xiàn)逆波蘭式

    這篇文章主要為大家詳細(xì)介紹了C++代碼實(shí)現(xiàn)逆波蘭式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用

    C++簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用

    類型轉(zhuǎn)換(type?cast),是高級(jí)語(yǔ)言的一個(gè)基本語(yǔ)法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類型名來(lái)表示,接下來(lái)讓我們一起來(lái)詳細(xì)了解
    2022-04-04
  • 詳談C++的內(nèi)存泄漏問(wèn)題

    詳談C++的內(nèi)存泄漏問(wèn)題

    下面小編就為大家?guī)?lái)一篇詳談C++的內(nèi)存泄漏問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • C++設(shè)計(jì)模式之CRTP的使用

    C++設(shè)計(jì)模式之CRTP的使用

    CRTP全稱是curious?recurring?template?pattern,即奇異遞歸模版模式,是一種c++的設(shè)計(jì)模式,精巧地結(jié)合了繼承和模板編程的技術(shù),下面就跟隨小編一起來(lái)學(xué)習(xí)一下CRTP的使用吧
    2023-10-10
  • C++ OpenCV繪制簡(jiǎn)易直方圖DrawHistImg

    C++ OpenCV繪制簡(jiǎn)易直方圖DrawHistImg

    本文主要介紹了一個(gè)能繪制簡(jiǎn)易直方圖的簡(jiǎn)單函數(shù)DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據(jù)自己的創(chuàng)意對(duì)其進(jìn)行改善和補(bǔ)充。需要的朋友可以參考一下
    2021-12-12
  • C++全面精通類與對(duì)象

    C++全面精通類與對(duì)象

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題

    C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題

    本文主要介紹了利用C++實(shí)現(xiàn)輸入兩個(gè)無(wú)環(huán)的單向鏈表時(shí),找出它們的第一個(gè)公共結(jié)點(diǎn)的問(wèn)題。文章中的示例代碼簡(jiǎn)潔易懂,感興趣的同學(xué)可以和小編一起學(xué)習(xí)一下
    2021-12-12
  • c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)

    c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)

    下面小編就為大家?guī)?lái)一篇c++連接mysql5.6的出錯(cuò)問(wèn)題總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦
    2016-12-12
  • C++成員函數(shù)中const的使用詳解

    C++成員函數(shù)中const的使用詳解

    這篇文章主要為大家詳細(xì)介紹了C++成員函數(shù)中const的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • vscode cmake compilers配置路徑的實(shí)現(xiàn)

    vscode cmake compilers配置路徑的實(shí)現(xiàn)

    本文主要介紹了vscode cmake compilers配置路徑的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03

最新評(píng)論

云南省| 枣强县| 大兴区| 宁国市| 漳州市| 阿勒泰市| 长海县| 双桥区| 岱山县| 镇巴县| 松溪县| 萨嘎县| 闸北区| 横峰县| 平阴县| 大田县| 宝丰县| 溧阳市| 株洲县| 襄樊市| 边坝县| 墨玉县| 蓬溪县| 会理县| 东海县| 红桥区| 长寿区| 茶陵县| 通道| 阳东县| 商丘市| 大连市| 浦北县| 阿城市| 台州市| 册亨县| 介休市| 巴塘县| 集贤县| 大英县| 桐庐县|