2 回答
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
函數(shù)的類型是函數(shù)原型去除所有非類型標(biāo)識(shí)符。
例如原型為int foo(float f, double d);的函數(shù),它的類型是int(float, double)。(LS“函數(shù)不能作為類型”當(dāng)然正確,函數(shù)不是類型;不過(guò)恐怕理解有誤,函數(shù)還是有類型的。)
函數(shù)類型被用于聲明函數(shù),但不能定義函數(shù),因?yàn)楹瘮?shù)不是對(duì)象,C/C++不提供對(duì)于函數(shù)定義的初始化語(yǔ)法。
例如
int foo1(float f, double d);
int foo2(float f, double d);
int foo3(float f, double d);
可以簡(jiǎn)化為
typedef int footype(float, double);
footype foo1, foo2, foo3;
函數(shù)類型的主要應(yīng)用是用于模板類型參數(shù)。例如template<R(P1, P2)>,函數(shù)類型R(P1, P2)是這里的模板類型參數(shù)。boost等庫(kù)中有很多這類技巧。
上例中函數(shù)對(duì)應(yīng)的函數(shù)指針類型為int (*)(float, double);。指針是對(duì)象,它可以被定義并初始化。并且,它可以作為函數(shù)的參數(shù)和返回值(函數(shù)本身就不行)。C語(yǔ)言中利用函數(shù)指針是通用函數(shù)回調(diào)的唯一手段。
例如(續(xù)上例):
int (*p1)(float, double) = &foo1;//函數(shù)類型在這里可以退化為對(duì)應(yīng)函數(shù)指針類型,&可以省略。
footype* p2 = foo2;
int (*p3)(float, double) = NULL;
注意,這里要求源文件或庫(kù)中有foo1、foo2的定義,否則會(huì)鏈接失敗。定義時(shí)不能直接用footype,要老老實(shí)實(shí)寫(xiě)int foo1(float f, double d)之類作為函數(shù)頭。
調(diào)用時(shí),函數(shù)指針可以直接當(dāng)作函數(shù)名稱使用,例如p1(1.0f, 1.0d);。
此外,C++中還有函數(shù)引用。上例中對(duì)應(yīng)的類型是int(&)(float, double)。具體用法類似,參照對(duì)象引用和對(duì)象指針的區(qū)別。
對(duì)于成員函數(shù),有成員函數(shù)指針(但沒(méi)有成員函數(shù)引用)。和對(duì)象指針不同,成員指針的值的含義比較模糊,取決于實(shí)現(xiàn)(編譯器)。(題外話,對(duì)成員函數(shù)指針的sizeof結(jié)果也取決于實(shí)現(xiàn),對(duì)于虛繼承的成員函數(shù),有些編譯器中可達(dá)20。)一般來(lái)說(shuō),成員函數(shù)指針保存了成員在類定義中的偏移量信息。根據(jù)成員函數(shù)指針和對(duì)應(yīng)類的實(shí)例,可以利用二元操作符->*和.*(不能被重載)運(yùn)算符調(diào)用這個(gè)函數(shù),左操作數(shù)為指向?qū)ο蟮闹羔樆驅(qū)ο?,右操作?shù)為成員函數(shù)指針。
例如LZ的例子中,this->*pf,也可以用(*this).*pf來(lái)調(diào)用成員函數(shù)指針pf指向的成員函數(shù)。
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
typedef void (B::*pf)();
定義了一個(gè)指針,這個(gè)指針指向B中的一個(gè)函數(shù),此函數(shù)沒(méi)有參數(shù)也沒(méi)有返回值。這個(gè)指針是一個(gè)新類型,名字是pf,以后可以定義pf類型的變量。
void f(){;}
在類B中定義了一個(gè)函數(shù)f,無(wú)參數(shù)無(wú)返回值。
void f2(pf pf) {
(this->*pf)();
}
定義了函數(shù)f2,參數(shù)是pf類型的,無(wú)返回值。f2函數(shù)中,會(huì)將參數(shù)pf指向的函數(shù)執(zhí)行一次。
void f3() {
f2(f);
}
定義了函數(shù)f3.無(wú)參數(shù),無(wú)返回值。其中調(diào)用了f2函數(shù),參數(shù)是f。f代表函數(shù)f的地址。
==========補(bǔ)充============
函數(shù)本身是不可以做類型的,但是指向函數(shù)的指針是可以的。這里的pf實(shí)際上是一個(gè)指向函數(shù)的指針。
- 2 回答
- 0 關(guān)注
- 202 瀏覽
添加回答
舉報(bào)
