函数名称前面加引用“&”或指针符号“*”的意思

    xiaoxiao2022-07-14  157

     

    C++的string类提供了大量的字符串操作函数,提取字符串的一部分,可采用substr函数实现:

    头文件:

    #include <string> //注意没有.h  string.h是C的标准字符串函数数,c++中一般起名为ctring.  而string头文件是C++的字符串头文件。

    函数原型:

    string substr(int pos = 0,int n ) const;

    函数说明:

     

    参数1pos是可缺省参数,默认为0,即:从字符串头开始读取。

    参数2n表示取多少个字符

    该函数功能为:返回从pos开始的n个字符组成的字符串,原字符串不被改变

    参考代码:

    学习笔记:

    (一)

    函数名称前面加引用符号“&”,代表该函数返回值类型是引用。

    如:int &operate+(...);

    (二)

    函数名称前面加指针符号“*”,代表它是函数指针。

    函数指针是一个指向函数的指针,函数指针表示一个函数的入口地址。使用函数指针的好处就是在处理“在运行时根据数据的具体状态来选择相应的处理方式”这种需求时更加灵活。

    定义一个函数指针 指针是变量,所以函数指针也是变量,因此可以使用变量定义的方式来定义函数指针,对于普通的指针,可以这么定义:

    int a=10;

    int *pa=&a;

    这里,pa是一个指向整型的指针,定义这个指针的形式为:

    int * pa;

    它说明了两点:(1)这是一个指针(2)这是一个指向整型变量的指针

    以下给出三个函数指针定义的形式,第一个是C语言的函数指针,第二个和第三个是C++的函数指针的定义形式(都是指向非静态函数成员的函数指针):

    int (*pFunction)(float,char,char)=NULL;

    int (MyClass::*pMemberFunction)(float,char,char)=NULL;

    int (MyClass::*pConstMemberFunction)(float,char,char) const=NULL;

    首先,要记住一点的就是形式一定要具备完备性,能表达出我们所要表达的内容,即指向函数这个事实。我们知道普通变量指针可以指向对应类型的任何变量,同样函数指针也应该能够指向对应类型的任何变量。对应的函数类型靠什么来确定?这个我们可以想一下C++的函数重载靠什么来区分不同的函数?这里,函数类型是靠这几个方面来确定的:(1)函数的参数个数(2)函数的参数类型(3)函数的返回值类型。所以我们要设计一种形式,这种形式定义的函数指针能够准确的指向这种函数类型的任何函数。

    在C语言中这种形式为:

    返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);  //注意这是在定义函数指针

    嗯,定义变量的形式显然不是我们通常见到的这种形式:

    类型名称 变量名称;

    因为函数指针不加括号就会产生二义性,就像下面这个:

    返回类型 *函数指针名称(参数类型,参数类型,参数类型,…);  //注意这是在定义函数

    这样的定义形式定义了一个“返回类型为‘返回类型*’参数为(参数类型,参数类型,参数类型,…)的函数而不是函数指针了。

    接下来,对于C++来说,下面这样的定义形式也就不难理解了(加上类名称是为了区分不同类中定义的相同名称的成员函数):

    返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….)

    函数的调用规则 一般来说,不用太关注这个问题。调用规则主要是指函数被调用的方式,常见的有_stdcall,_fastcall,_pascal,_cdecl等规则。不同的规则在参数压入堆栈的顺序是不同的,同时在有调用者清理压入堆栈的参数还是由被调用者清理压入堆栈的参数上也是不同的。一般来说,如果你没有显式的说明调用规则的话,编译器会统一按照_cdecl来处理。

     

    给函数指针赋值和调用 给函数指针赋值,就是为函数指针指定一个函数名称。这个过程很简单,下面是两个例子:

    int func1(float f,int a,int b){return f*a/b;}

    int func2(float f,int a,int b){return f*a*b}

    然后我们给函数指针pFunction赋值:

    pFunction=func1;

    pFunction=&func2;

    上面这段代码说明了两个问题:(1)一个函数指针可以多次赋值(引用不能这样)(2)取地址符号是可选的,却是推荐使用的。

    我们可以思考一下为什么取地址符号是可选的,在普通的指针变量赋值时,如上面所示,需要加取地址符号,而这里却是可选的?这是由于要同时考虑到两个因素(1)避免二义性(2)形式一致性。在普通指针赋值,需要加取地址符号是为了区别于将地址还是将内容赋给指针。而在函数赋值时没有这种考虑,因为这里的语义是清晰的,加上&符号是为了和普通指针变量一致---“因为一致的时候就不容易出错”。

    最后我们来使用这个函数,以下两者调用函数的方法都是可以的

    pFunction(10.0,’a’,’b’);

    (*pFunction)(10.0,’a’,’b’);

    同时函数指针可以当参数使用实现回调函数,让程序变得更加简单。  

     
    最新回复(0)