aihot  2020-11-12 09:24:52  OpenCV |   查看评论   

还有一种要注意的就是有默认参数的函数,比如我们定义6号函数为void f(double,int =1);那么在调用f(4.2)时就会有二义性。

可基于函数的引用形参是指向const对象还是指向非const对象实现函数重载。

bool isLonger(const string &s1, const string &s2) {     return s1.size() > s2.size(); }

四、函数指针

1,如何定义一个指针为函数类型?我们知道一个函数的类型是由它的返回类型和形参类型共同决定,而与函数名无关。所以在定义一个指向函数的指针,必须包含形参表与返回值这些信息。

下面来看一个比较两个字符串长度的函数:

bool lengthCompare(const string&, const string&);

那么这个函数的类型即bool(const string&, const string&) 。如果要想定义一具指向这种类型函数的指针,则可以如下定义:

bool (*pf) (const string&, const string&);

注意上式中*pf外面的括号不可以省略,不然pf就成了一个函数的定义,这个函数返回一个指向bool类型的指针。

2,当我们把函数名作为一个值使用时,该函数自动地转换成指针,所以我们可以这样对函数指针pf初始化。

pf = lengthCompare; pf = &lengthCompare;

上面两种方法是等价的。

那么在使用函数指针时,我们可以解引用,也可以不解引用。

bool b1 = pf("hello","goodbye"); bool b2 = (*pf)("hello","goodbye");

3,在给函数指针赋值的时候,一定要注意函数类型的完全匹配,但是我们可以给指向任意函数类型的指针赋一个nullptr或值为0的整型常量表达式,表示该指针没有指向任何一个函数。

4,如果定义了指向重载函数的指针,在使用这个指针时并不是根据形参来确定所调用的函数,而是根据指针的具体函数类型。即,编译器根据指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配。

void ff(int*); void ff(int); void ff(unsigned int);  void (*pf)(unsigned int) = ff; // pf指向ffunsigned int)
int num = 42; pf(num); // num将转换为unsigned类型

5,函数指针作为另一个函数的形参。

有的时候,我们需要将一个函数作为一个参数传递给别一个参数,比如定义一个函数用来返回两个对象中较大的那个,那么我们需要将一个比较函数作为参数传递。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:函数全解析

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]