`
caozuiba
  • 浏览: 901050 次
文章分类
社区版块
存档分类
最新评论

C/C++ 函数中参数和返回值传递简记

 
阅读更多

原文:C/C++ 函数参数和返回值传递机制
作者:Breaker <breaker.zy_AT_gmail>


简单记录一下 C++ 函数调用中,参数和返回值传递的方法和步骤

参数传递

函数参数的传递是初始化语义:用调用者的实参去初始化函数的形参,如果参数是对象,需要调用该类的拷贝构造函数,如果没有显式定义的拷贝构造函数,则执行默认的按成员拷贝

返回值传递

函数返回值的传递内容稍多,示例代码:

返回过程执行下列步骤:

1. get_test_obj() 中,用返回对象 ret_obj 初始化一个类型为 TestClass(返回类型)的 临时对象 tmp_obj(假设名),这个临时对象放置在调用者 user() 的栈内。GCC 4 和 VC 2005 使用返回值临时对象的方式不同,见下面

Bjarne 关于临时对象销毁的说法:临时对象在维持它的那条语句之后被销毁,除非临时对象被约束到其它名字,此时由这个命名名字控制临时对象的生存期。可以用对象初始化的语法(显示或隐式的),或对象引用来约束这个临时对象,两者的效果是一样的,因为期间只有一个对象本体,就是临时对象的本体,约束期间不产生任何初始化、赋值语义

2. get_test_obj() 中,由 ret_obj 的生存期,决定何时将其销毁。如果 ret_obj 是局部对象(形参 或 函数内定义非 static 变量),则在返回时销毁

3. 如果 user() 中使用函数返回值进行 赋值操作 obj = get_test_obj(),则执行 obj.operator=(tmp_obj),没有重载的 TestClass::operator=(right) 和 ::operator=(TestClass, right) 时,执行 TestClass 的每个成员的 operator=()

4. 如果 user() 中使用函数返回值进行 初始化操作,包括以下几种语法:

隐式和显式初始化可能有 2 种实现:

(1). 直接将函数 get_test_obj() 返回的临时对象 tmp_obj 约束到 obj,不调用 TestClass 的任何构造函数(包括拷贝构造函数),在初始化语句执行后,不会销毁 tmp_obj,而由 obj 控制 tmp_obj 的生存期

(2). 调用 TestClass 的拷贝构造函数,以返回的 tmp_obj 为参数拷贝构造对象 obj。这种方式,在初始化语句执行后,tmp_obj 就没有用了,将被销毁

VC 2005 采用 (1) 方式实现

GCC 4 的返回值临时对象

-O0 关闭编译优化

无论是在 user() 内使用返回值赋值、初始化,还是不使用返回值,在 get_test_obj() 返回时,都 不创建额外的临时对象 tmp_obj,而直接将 get_test_obj() 的局部对象 TestClass ret_obj(200) 作为临时对象,即被调函数返回后,将其栈交给调用者控制,作为调用者的栈,这种返回对象的方法比 VC 2005 的效率高

下面是 GCC 4 中,调用者使用函数返回值的几种情况:

1. 如果调用者没有使用返回值,在被调函数返回时销毁 return ret_obj 中的 ret_obj

2. 进行返回值赋值 或 初始化对象时,方式和 VC 2005 类似,只是不创建临时对象 tmp_obj,而使用局部对象 ret_obj

3. 当初始化返回值到引用名时,不能初始化到 非常量 的引用 TestClass& obj_ref = get_test_obj(),会报编译错误:

应该使用常量引用 const TestClass& obj_ref = get_test_obj()

另一个 GCC 4 有别于 VC 2005 的 const 保护行为:一个 const 对象调用的方法必需是 const 方法,比如 const TestClass obj 调用 obj.print_intval() 时,如果不是 void print_intval() const,会报编译错误:

分享到:
评论

相关推荐

    英语音标简记法-英语学习

    英语音标简记法英语音标简记法英语音标简记法英语音标简记法英语音标简记法英语音标简记法

    jsp标准语法中7大动作 简记(经典)

    jsp标准语法中7大动作 简记(经典) jsp标准语法中7大动作 简记(经典)

    简记个人博客源码免费分享

    简记个人博客网站源码为博主现有博客网站,前端采用LayUI框架,此分享版本为asp + access。所有功能齐全,欢迎使用。 使用方法:上传至空间或服务器,通过IIS发布网站即可。 演示地址:...

    高中化学各简记规律.docx

    高中化学各简记规律.docx

    高中历史之历史百科简记美国“飞虎队”在云南素材

    高中历史之历史百科简记美国“飞虎队”在云南素材

    练习简记第一期

    这是群主Earnest为大家出过的习题及答案,第一期共两个题~。

    497476974884240简记.apk

    497476974884240简记.apk

    线性规划(Linear Programming 简记 LP

    在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支—数学规划,而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。...

    一个简单C程序的编程简记

    这篇文字记录的是 第一次从头到尾构建C程序工程过程中所涉及到的 有助于程序更合理的一些技术或编程规范。在这篇文字中,一些在实践中会花费很多精力和时间的编程项,在用表达时却发现只需一两句朴素文字就可将其...

    一个简单C程序的编写简记

    这篇文字记录的是 第一次从头到尾构建C程序工程过程中所涉及到的 有助于程序更合理的一些技术或编程规范。在这篇文字中,一些在实践中会花费很多精力和时间的编程项,在用表达时却发现只需一两句朴素文字就可将其...

    PIC单片机C语言简记

    PICC编译器可以直接挂接在MPLAB-IDE集成开发平台下,实现一体化的编译连接和原代码调试。使用MPLAB-IDE内的调试工具ICE2000 、ICD2 和软件模拟器都可以实现原代码级的程序调试,非常方便。

    tanx的连分数展开的注记_魏焕

    连分数(continued fraction)是特殊繁分数。如果a0,a1,a2,…an,…都是整数,则将分别称为无限连分数和有限连...在近代计算数学中它常与某些微分方程式差分方程有关,与某些递推关系有关的函数构造的应用相联系。

    数据结构课程设计报告电梯操作系统C++

    在离散的模拟中, 以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。 --------&gt;2.基本要求 模拟某校五层教学楼的...

    七年级英语音标简记法PPT教案.pptx

    七年级英语音标简记法PPT教案.pptx

    简记个人博客网站源码 v2.10.01.rar

    简记个人博客网站源码 v2.10.01.rar

    基于python实现简单C/S模式代码实例

    C/S模式就是指客bai户端/服务器模式,du是计算机软件...根据客户/服务器(Client/Server简记为C/S)体系结构的概念,至少用两台计算机来分别充当客户机和服务器角色。 服务器端代码: #!/usr/bin/python import tim

    考试_上课简记&qq群消息汇总.pdf

    考试_上课简记&qq群消息汇总.pdf

    Java字符集编码简记

    NULL 博文链接:https://joard.iteye.com/blog/403031

    多元函数的三角多项式逼近 (1956年)

    设D表示xy平面上的矩形区域:0≤x≤2π;0≤y≤2π,我们所考虑的函数f(x,y)都是在D上确定的周期函数,关于每一变量的周期都是2π。 假如f(x,y)在D上有p级连绩偏导数,...当p=0时,C~o(D)简记作C(D),表示在D上连续的函数类。

    pongo_who挑战赛

    甲赢,即(r+ire)%2=1, 其中r为who的返回值, ire为who中删除字符'*'标记个数. char*p=word; while(*p){ if(*p=='*')ire++; p++;} int ic=strlen(word)-ire; if(ic) return ire%2; //printf("%d\t%d\t%s\n", ic,...

Global site tag (gtag.js) - Google Analytics