经典 函数解释.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
经典 函数解释

利用引用传递动态内存 void MyFunc(char *pReturn, int num) { pReturn = new char[num]; } int main(int argc, char* argv[]) { char *pMyReturn=NULL; MyFunc(pMyReturn,10); strcpy(pMyReturn,hello world); delete [ ]pMyReturn; pMyReturn = NULL; return 0; } 利用二级指针传递动态内存 void MyFunc(char **pReturn, int num) { *pReturn = new char [num]; } int main(int argc, char* argv[]) { char *pMyReturn=NULL; MyFunc(pMyReturn,20); strcpy(pMyReturn,hello world); delete [ ]pMyReturn; pMyReturn = NULL; return 0; } 利用函数返回值传递动态内存 char *MyFunc (int num) { return new char [num]; } int main(int argc, char* argv[]) { char *pMyReturn= MyFunc(20); strcpy(pMyReturn,hello world); delete [ ]pMyReturn; pMyReturn = NULL; return 0; } * 讲解时,要注意参数表不包括参数名字 * _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是MFC缺省调用约定。 * (实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈) * 上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部所有调用dbtest(i)的地方都换成了(i%2>0)?奇:偶这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。 从表面上看,内联函数类似于c语言中的#define宏定义。define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c++中是不推荐使用define的 * * * 讲解重点为参数的值传递和引用传递的本质。本质为对参数的使用方式。 * 请在课堂上带领学员在VC内演示 * 请在课堂上带领学员在VC内演示 * 请在课堂上带领学员在VC内演示 * 目录 函数概述 函数的声明和定义 函数的内存存储 函数的参数传递 函数的返回值 内联函数 函数指针 函数间动态内存的传递 函数的返回值 一个没有声明为void的函数都必须返回一个值,缺少返回值将引起编译错误。返回值由返回语句描述: return +表达式; 如果被返回的值的类型与函数返回类型不匹配,那么如果可能的话,将应用隐式类型转换,如果无法隐式转换,则产生一个编译错误。 函数的返回值-实质 函数的返回值一般是采用寄存器传递的,通常eax寄存器作为函数返回值寄存器。因此函数的返回值也是一个临时副本,也就是return语句后面的表达式值的临时副本。函数的返回值可以是值也可以是地址。 函数的返回值-值传递 缺省情况下,函数的返回值是按值传递的(passed by value)。这意味着得到控制权的函数将接收返回语句中指定的表达式的拷贝。例如: int grow( int* p ) { int val; // ... return val; } grow( )把存储在 val 中的值的拷贝返回到调用函数,但调用函数不能用任何方式修改val。 函数的返回值-引用传递 上面的缺省行为可以被改变,一个函数可以被声明为返回一个指针或一个引用,当函数返回一个引用时,调用函数接收 val 的左值,即,调用函数可以修改 val 或取它的地址。grow() 可以如下声明返回一个引用: extern int res; //res是函数外部的变量 int grow() { ……. //

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档