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

http://blog.csdn.net/qq_38124695/article/details/78188643

 分类:
C++(7) 

目录(?)[+]

学习笔记:

(一)

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

如: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’);

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

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

  1. php 调用变量方法名,php中引用(变量和函数名前加符号)用法

    本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...

  2. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  3. C++ 函数参数传递:传值,传指针,传引用

    PS:首先理解形参   实参概念.形参是在函数定义的括号内定义的专用变量,它们的目的是保存按实参传递给它们的信息,实参被列在函数调用语句的括号内. int func(int x)//x是形参 {ret ...

  4. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题

    在VS2008和opendv的环境下: error LNK2019: 无法解析的外部符号_cvDestroyWindow,该符号在函数_wmain 中被引用 error LNK2019: 无法解析的外 ...

  5. [C++11]弱引用智能指针weak_ptr初始化和相关的操作函数

    弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手,它不管理 shared_ptr 内部的指针.std::weak_ptr 没有重载操作符 * 和 ->,因为它 ...

  6. 该符号在函数 _main 中被引用

    该符号在函数 _main 中被引用 今天上午的错误终于搞明白了,原来我在建立win32 控制台工程的时候 选用了visual 2005的默认设置,这样就使得项目的附加选项中选择了[预编译头]选项,改选 ...

  7. VS报错LNK2019 无法解析的外部符号 _main,函数 “int __cdecl invoke_main(void)“ (?invoke_main@@YAHXZ) 中引用了该符号的解决方法

    很多C初学者或者新人在使用VS编译器编写C代码运行时提示:严重性 代码 说明 项目 文件 行 禁止显示状态错误 LNK2019 无法解析的外部符号 _main,函数 "int __cdecl ...

  8. 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

    一,问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引 ...

  9. LNK2019 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用

    在VS2017中新建Qt GUI 工程,无法编译,报链接错误 LNK2019 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用 经比对,是l ...

最新文章

  1. 软件工程实训有必要吗_人工智能专业值得读吗?就业如何?
  2. java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方案
  3. 042_Popconfirm气泡确认框
  4. 初识莫队——小Z的袜子
  5. 在阿里,我们如何管理代码分支?
  6. 前端“黑话”polyfill
  7. java兔子问题编程思路详解_Java算法之“兔子问题”
  8. 拓端tecdat|R语言用普通最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
  9. Gram matrix(格拉姆矩阵)
  10. jsp % % ! 区别
  11. 在Kali Linux上安装LOIC
  12. Foobar2000中文版增强安装版
  13. 苹果谷歌微软薪酬大揭秘,最高320万元!
  14. 可以代替专业CAD的《燕秀工具箱》V2.81版-模具设计外挂
  15. PHP运行的环境安装
  16. 多模态训练如何平衡不同模态
  17. webpack-图片配置
  18. Python便捷写法:[[0] * n for _ in range(n)]
  19. linux没有semanage命令,semanage命令
  20. 计算机域名(domain name)

热门文章

  1. IEEE作者中心!解决你的选刊,模板,选题,写做的一系列困难!!!拿走不谢!!!
  2. 在苏州的一个超级棒的事情
  3. sqlite3 命令行简易教程
  4. 【转】.NET NPOI操作Excel常用函数
  5. 实践编译LINUX0.11源码,感觉真爽。
  6. XML 需要用的空间
  7. 一起谈.NET技术,数据库访问的性能问题与瓶颈问题
  8. NYOJ 115 城市平乱
  9. Golang之函数选项模式
  10. 返回一个二维整数数组中最大子数组的和