C++ 中的形参与返回值
函数调用时,形参对象和返回对象均采用引用方式进行(临时对象作为中介),当一个对象作为参数(非引用)被函数调用时,该对象会通过复制构造函数获得一个临时对象,该临时对象以引用方式传递给函数,简言之,函数会被做以下处理:
void foo(A x);
A a
foo( a);
处理后:
void foo(A& x);
A a
A x(a);
foo(x);
而返回值则根据不同的函数调用方式来进行不同程度的优化,如下面的调用方式,会直接将对象b作为引用传递给函数bar:
A bar();
A b = bar();
//处理后
bar(A& a);
A b;
bar(b);
如先定义一个对象,编译器就不会对此种情况优化。
A a;
a = bar();//bar函数先产生一个临时对象,再调用赋值构造函数
完整测试代码如下:
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring> using namespace std; class A {
public:
A()
{
str = (char *)calloc(sizeof(char),10);
memcpy(str,"hello",5);
cout << "A()" << endl;
} ~A()
{
//delete str;
cout << "~A()" << endl;
} A(const A& a)
{
cout << "A(const A &a)" << endl;
} A& operator=(const A &a) {
cout << "A operator=(const A&a)" << endl;
} private:
char *str;
int len;
}; void foo(A a)
{
cout << "void foo(A)" << endl;
} A bar()
{
A a;
cout << "A bar()" << endl;
return a;
} int main(int argc, char *argv[])
{
A a; // A x(a)
// foo(&x);
//foo(a); //A b = bar(); a = bar(); return 0;
}
从上面的例子来看,赋值函数、复制构造函数与构造函数地位同等重要。
C++ 中的形参与返回值的更多相关文章
- 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用
来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...
- Java 中无参带返回值方法的使用
如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...
- python中os.system()的返回值
[python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...
- Java基础——引用类型作为形参与返回值
一.具体类名作为形参与返回值 1.方法的形参是类名,其实需要的是该类的对象 比如有一个具体的猫类,我使用另一个类使用猫类的方法 public class CatOperator { public ...
- 慕课网-Java入门第一季-7-5 Java 中带参无返回值方法的使用
public class HelloWorld { public static void main(String[] args) { // 创建对象,对象名为hello HelloWorld hell ...
- Java 中带参无返回值方法的使用
有时方法的执行需要依赖于某些条件,换句话说,要想通过方法完成特定的功能,需要为其提供额外的信息才行.例如,现实生活中电饭锅可以实现“煮饭”的功能,但前提是我们必须提供食材,如果我们什么都不提供,那就真 ...
- [转] C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- 转:C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- Java引用类型作为形参和返回值
一.什么是引用类型 在Java中引用类型包括三种:类.抽象类.接口. 二.引用类型作为形参使用 1.类作为形参 /** * 类作为形参,实际传递的是该类的对象 */ class Student { p ...
随机推荐
- CSS3的chapter4
段落样式: 行高——line-height p { line-height:25px | 150% | normal;} 段落缩进——text-indent p { text-indent:2em;} ...
- REST 架构风格
目前基于网络应用的架构风格主要有三种: RPC架构风格 将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务.SOAP就是RPC风格的一种架构.过程是动词性的(做某件事),因此RPC建 ...
- Spring + Mybatis 使用 PageHelper 插件分页
原文:http://www.cnblogs.com/yucongblog/p/5330886.html 先增加maven依赖: <dependency> <groupId>co ...
- knn原理与实践
knn法是一种基本分类与回归方法 应用:knn算法不仅可以用于分类,还可以用于回归.. 1.文本分类:文本分类主要应用于信息检索,机器翻译,自动文摘,信息过滤,邮件分类等任务. 2.可以使用knn算法 ...
- update 多表
update energylog set value=(a.value+c.value)/2from energylog as a, energylog as cwhere a.idvariable= ...
- js中的cookie操作
一.js cookie 使用时把此段代码引入页面 (function (factory) { if (typeof define === 'function' && define. ...
- Java: IO 字节流
FileReader是InputStreamReader的子类,InputStreamReader是Reader的子类.Reader系列是输入字符流. 1.一个字符一个字符的读取 import jav ...
- 源代码tfs to git
TFSàgit可以保留完整历史记录,方法: https://github.com/git-tfs/git-tfs 系统变量的path里加上: ;C:\Program Files (x86)\Git\b ...
- OC语言description方法和sel
OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...
- 解决ajax中文乱码问题
主要遇到的问题: 一.ajax向服务器提交的数据有中文,没有设置编码方式.造成服务器接收到乱码 二.服务器向ajax返回数据中有中文,没有设置响应编码方式,造成ajax接收到乱码 乱码产生的原因:不管 ...