首页 文章 精选 留言 我的

精选列表

搜索[数学],共4232篇文章
优秀的个人博客,低调大师

c++之重载函数学习总结

一、C++中的函数重载: 1、函数重载的概念: 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 注意:在c语言中是没有函数重载这个概念的。 代码示例演示: #include<stdio.h>#include<string.h>intfunc(intx){returnx;}intfunc(inta,intb){return(a+b);}intfunc(constchar*s){returnstrlen(s);}intmain(){return0;} 上面在c++编译器里面编译时没有问题的,如果放在c语言编译器里面编译是会报错的: root@txp-virtual-machine:/home/txp#gcctest5.ctest5.c:8:5:error:conflictingtypesfor‘func’intfunc(inta,intb)^test5.c:3:5:note:previousdefinitionof‘func’washereintfunc(intx)^test5.c:13:5:error:conflictingtypesfor‘func’intfunc(constchar*s)^test5.c:3:5:note:previousdefinitionof‘func’washereintfunc(intx) 所以说c语言里面不支持函数重载。 2、函数重载至少要满足下面的一个条件: 参数个数不同 参数类型不同 参数顺序不同 比如下面两个函数可以构造重载函数吗? intfunc(inta,constchar*s){returna;}intfunc(constchar*s,inta){returnstrlen(s)} 答案肯定是可以构造重载函数的,读者可以自己试试(这个比较好理解)。 3、当函数默认参数遇上函数重载会发生什么? 例如下面的两个函数: intfunc(inta,intb,intc=0){returna*b*c;}intfunc(inta,intb){returna+b;} 到底会发生啥,我们还是看下面这个实验: #include<stdio.h>intfunc(inta,intb,intc=0){returna*b*c;}intfunc(inta,intb){returna+b;}intmain(intargc,char*argv[]){intc=func(1,2);return0;} 运行结果: root@txp-virtual-machine:/home/txp#g++test5.cpptest5.cpp:Infunction‘intmain(int,char**)’:test5.cpp:16:22:error:callofoverloaded‘func(int,int)’isambiguousintc=func(1,2);^test5.cpp:16:22:note:candidatesare:test5.cpp:3:5:note:intfunc(int,int,int)intfunc(inta,intb,intc=0)^test5.cpp:8:5:note:intfunc(int,int)intfunc(inta,intb) 从上面报错的结果里面有一个单词ambiguous(意思是梦棱两可的),也就是说默认参数这种使用时不允许的。 4、C++编译器调用重载函数的准则: 将所有同名函数作为候选者 尝试寻找可行的候选函数: 精确匹配实参 通过默认参数能够匹配实参 通过默认类型转换匹配实参 匹配失败: 最终寻找到的候选函数不唯一,则出现二义性,编译失败 无法匹配所有候选者,函数未定义编译失败 5、函数重载的注意事项: 重载函数在本质上是相互独立的不同函数 重载函数的函数类型不同 函数返回值不能作为函数重载的依据 函数重载是由函数名和参数列表决定的 代码测试: #include<stdio.h>intadd(inta,intb)//int(int,int){returna+b;}intadd(inta,intb,intc)//int(int,int,int){returna+b+c;}intmain(){printf("%p\n",(int(*)(int,int))add);printf("%p\n",(int(*)(int,int,int))add);return0;} 运行结果: root@txp-virtual-machine:/home/txp#./a.out0x40052d0x400541 从输出结果我们可以看出这两个函数的入口地址不一样,这表明这两个函数是不同的函数。 6、小结: 函数重载是c++中引入的概念 函数重载的本质是相互独立的不同函数 c++中通过函数名和函数参数确定函数调用 二、重载函数进阶学习 1、重载与指针: 下面的函数指针将保存哪个函数的地址? intfunc(intx){returnx;}intfunc(inta,intb){returna+b;}intfunc(constchar*s){returnstrlen(s);}typedefint(*PFUNC)(inta);intc=0;PFUNCp=func;c=p(2)//到底选择哪个func函数 函数重载遇上函数指针: 将函数名赋值给函数指针时 根据重载规则跳线与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 代码试验: #include<stdio.h>#include<string.h>intfunc(intx){returnx;}intfunc(inta,intb){returna+b;}intfunc(constchar*s){returnstrlen(s);}typedefint(*PFUNC)(inta);intmain(intargc,char*argv[]){intc=0;PFUNCp=func;c=p(2);printf("c=%d\n",c);return0;} 输出结果: root@txp-virtual-machine:/home/txp#./a.outc=2 从输出结果来看,很明显调用了第一个func函数。 2、注意: 函数重载必然发生在同一个作用域中 编译器需要用参数列表或者函数类型进行函数选择(也就是说碰到指针,要注意函数类型了) 无法直接通过函数名得到重载函数的入口地址,这里还是通过上面的例子演示一下: #include<stdio.h>intadd(inta,intb)//int(int,int){returna+b;}intadd(inta,intb,intc)//int(int,int,int){returna+b+c;}intmain(){printf("%p\n",add);printf("%p\n",add);return0;} 输出结果: root@txp-virtual-machine:/home/txp#g++test5.cpptest5.cpp:Infunction‘intmain()’:test5.cpp:15:23:error:overloadedfunctionwithnocontextualtypeinformationprintf("%p\n",add);^test5.cpp:16:23:error:overloadedfunctionwithnocontextualtypeinformationprintf("%p\n",add); 三、C++和C相互调用: 实际工程中C++和c代码相互调用是不可避免的 c++编译器能够兼容c语言的编译方式 c++编译器会优先使用c++编译的方式 extern关键字能够强制让C++编译器进行c方式的编译: extern"c"{} 1、下面进行一个c++中调用c函数,这里我在当前创建三个文件:add.c 、add.h 、main.cpp。内容分别如下: add.c内容: #include"add.h"intadd(inta,intb){returna+b;} add.h内容: intadd(inta,intb); 然后我用gcc编译编译生成add.o文件: root@txp-virtual-machine:/home/txp/add#vimadd.croot@txp-virtual-machine:/home/txp/add#vimadd.hroot@txp-virtual-machine:/home/txp/add#gcc-cadd.c-oadd.oroot@txp-virtual-machine:/home/txp/add#lsadd.cadd.hadd.o 然后main.cpp里面调用add.c #include<stdio.h>intmain(){intc=add(1,2);printf("c=%d\n",c);return0;} 输出结果: root@txp-virtual-machine:/home/txp/add#g++main.cppadd.o/tmp/ccqz3abQ.o:Infunction`main':main.cpp:(.text+0x13):undefinedreferenceto`add(int,int)'collect2:error:ldreturned1exitstatus 结果显示找不到这个函数,为了能够在c++里面调用c语言里面的函数,我们就要使用刚才上面讲的第四点了;这里我们先用nm命令来查看一下add.o文件里面是否生成符号表(有生成): root@txp-virtual-machine:/home/txp/add#nmadd.o0000000000000000Tadd 解决方法,main.cpp改成: #include<stdio.h>extern"c"{#include"add.h"}intmain(){intc=add(1,2);printf("c=%d\n",c);return0;} 输出结果: root@txp-virtual-machine:/home/txp/add#./a.outc=3 2、c中如何调用c++函数: 这里我把main.cpp的内容改成: extern"C"{intadd(inta,intb);}intadd(inta,intb){returna+b;} 编译输出: root@txp-virtual-machine:/home/txp/add#g++-cmain.cpp-otest.oroot@txp-virtual-machine:/home/txp/add#nm-stest.o0000000000000000Tadd add.c文件内容改成: #include<stdio.h>intmain(){intc=0;c=add(2,3);printf("c=%d\n",c);return0;} 输出结果: root@txp-virtual-machine:/home/txp/add#gccadd.ctest.oroot@txp-virtual-machine:/home/txp/add#./a.outc=5 3、如何保证一段c代码只会以c的方式被编译? 解决方法如下: __cplusplus是c++编译器内置的标准宏定义 __cplusplus的意义,确保c代码以统一的c方式被编译成目标文件 #ifdef__cplusplusextern"C"{#endif#ifdef__cplusplus}#endif 这里把main.cpp改成: #include<stdio.h>#ifdef__cplusplusextern"C"{#endif#include"add.h"#ifdef__cplusplus}#endifintmain(){intc=add(1,2);printf("c=%d\n",c);return0;} 输出结果: root@txp-virtual-machine:/home/txp/add#g++main.cppadd.oroot@txp-virtual-machine:/home/txp/add#./a.outc=3 4、注意事项 C++编译器不能以c的方式编译重载函数 编译方式决定函数名被编译后的目标名 c++编译方式将函数名和参数列表编译成目标名,这里举个例子main.cpp: intadd(inta,intb){returna+b;}intadd(inta,intb,intc){returna+b+c;} 编译输出: root@txp-virtual-machine:/home/txp/add#g++-cmain.cpp-otest.ooroot@txp-virtual-machine:/home/txp/add#nmtest.oo0000000000000000T_Z3addii0000000000000014T_Z3addiii 说明ii表示两个参数,iii表示三个参数 c编译方式只将函数名作为目标名进行编译,这里还是以main.cpp为例: extern"C"{intadd(inta,intb){returna+b;}intadd(inta,intb,intc){returna+b+c;}} 输出结果: root@txp-virtual-machine:/home/txp/add#g++-cmain.cpp-otest.oomain.cpp:Infunction‘intadd(int,int,int)’:main.cpp:8:29:error:declarationofCfunction‘intadd(int,int,int)’conflictswithintadd(inta,intb,intc)^main.cpp:3:5:error:previousdeclaration‘intadd(int,int)’hereintadd(inta,intb) 目标名起冲突所以报错。 5、小结: 函数重载是c++对c的一个重要升级 函数重载通过参数列表区分不同的同名函数 extern关键字能够实现c和c++的相互调用 编译方式决定符号表中的函数名的最终目标名 四、总结: 好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见! 本文分享自微信公众号 - TXP嵌入式(txp1121518wo-)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Python零基础学习笔记(八)—— 数学功能

一定要导入math包,不然后面会报错 今日学习部分及执行结果如下图 import math # abs() 返回数的绝对值 a1 = -10 a2 = abs(a1) print(a2) #比较两个数的大小 a3 = 10 a4 = 9 print((a3>a4)-(a3<a4)) # max() 返回参数中的最大值 print(max(1,2,3,4,5)) # min() 返回参数中的最小值 print(min(1,2,3,4,5)) # pow() 求x的y次方 例如2^4 print(pow(2,4)) #round(x[, n]) x为数值,n为保留位数,n可有可无 # 四舍五入 print(round(3.576)) print(round(3.492)) #四舍五入保留位数 print(round(3.576, 1)) print(round(3.492, 2)) # math.ceil() 向上取整 print(math.ceil(8.1)) print(math.ceil(5.9)) # math.floor() 向下取整 print(math.floor(8.1)) print(math.floor(5.9)) # math.modf() 返回整数部分与小数部分 print(math.modf(12.3)) # math.sqrt() 开方 print(math.sqrt(25))

优秀的个人博客,低调大师

GNU Octave 7.3.0 发布下载,数学软件包

GNU Octave 7.3.0 发布,现已可供下载。这是一个错误修复版本,具体更新内容如下: 改进和修复 scanf:到达 end of stream 时不要设置 error(bug#62723) 修复在混合@class/classdef类中显示的重复名称(bug #62802) canonicalize_file_name:处理指向 UNC 网络共享的符号链接(bug #62847) canonicalize_file_name:对映射的网络驱动器进行通用检查(bug #62847) fortran_vec:修复可能导致指针悬空的方法链接实例 修复某些 LaTeX 字符串的 PDF 打印输出中的错误颜色(bug #62884) unpack.m:在 Windows 上的路径中 Escape backslashes(bug #62888) canonicalize_file_name: 检查潜在映射网络驱动器的根目录 (bug #62847) nextpow2.m:修复 0.5 到 1 之间的输入(bug #62947) quad2d:修复意外的复共轭返回(bug#62972) 确保不会将 short 8.3 path 传递给 Windows 上的latex(bug #62779) canonicalize_file_name:修剪映射的网络驱动器根部的尾部文件分隔符(bug #62847) imformats.m:修复isa函数中的返回值(bug #62974) pie3:修复“Too many input”参数错误 修复 lsqnonneg 和 pqpnonneg 的错误 lambda 输出(bug #63178) addtodate.m:修复从某些月末日期减去一个月时返回的错误月份(bug#60671) var.m: 修复一些 Inf 和 NaN 输入返回 0 而不是 NaN的问题 (bug #63203) var.m:修复带有矢量加权的稀疏和对角矩阵输入的自动 broadcasting 错误(bug#63291) dec2bin.m:修复输入验证(bug #63089) glpk.m: 避免在潜在的 sparse input 上使用isfinite var.m: 使用bsxfun而不是矢量加权进行broadcasting(bug #63291) 修复 in-place broadcasting 操作中的越界索引问题(bug #63303) 更多详情可查看官方公告。

优秀的个人博客,低调大师

(Python)零起步数学+神经网络入门

在这篇文章中,我们将在Python中从头开始了解用于构建具有各种层神经网络(完全连接,卷积等)的小型库中的机器学习和代码。最终,我们将能够写出如下内容: 假设你对神经网络已经有一定的了解,这篇文章的目的不是解释为什么构建这些模型,而是要说明如何正确实现。 逐层 我们这里需要牢记整个框架: 1. 将数据输入神经网络 2. 在得出输出之前,数据从一层流向下一层 3. 一旦得到输出,就可以计算出一个标量误差。 4. 最后,可以通过相对于参数本身减去误差的导数来调整给定参数(权重或偏差)。 5. 遍历整个过程。 最重要的一步是第四步。我们希望能够拥有任意数量的层,以及任何类型的层。但是如果修改/添加/删除网络中的一个层,网络的输出将会改变,误差也将改变,误差相对于参数的导数也将改变。无论网络架构如何、激活函数如何、损

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册