对象作为参数传递时是传值。把实参的对象赋值给形参。因此效率有点低。

c++传参方式可以分为2种:

1.传值 (指针作为参数,本质上也只是把地址作为值传递了而已)。

2.传引用。

所以,一切传递方式不是传引用就是传值。不像javascript,如果是原始数据类型则传值,如果是对象数据类型则传引用

如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。

例如:

class String

{⋯

// 赋值函数

String & operate=(const String &other);

// 相加函数,如果没有friend 修饰则只许有一个右侧参数

friend String operate+( const String &s1, const String &s2);

private:

char *m_data;

}

String 的赋值函数operate = 的实现如下:

String & String::operate=(const String &other)

{

if (this == &other)

return *this;

delete m_data;

高质量C++/C 编程指南,v 1.0

2001 Page 39 of 101

m_data = new char[strlen(other.data)+1];

strcpy(m_data, other.data);

return *this; // 返回的是 *this 的引用,无需拷贝过程

}

对于赋值函数,应当用“引用传递”的方式返回String 对象。如果用“值传递”的

方式,虽然功能仍然正确,但由于return 语句要把 *this 拷贝到保存返回值的外部存

储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:

String a,b,c;

a = b; // 如果用“值传递”,将产生一次 *this 拷贝

a = b = c; // 如果用“值传递”,将产生两次 *this 拷贝

String 的相加函数operate + 的实现如下:

String operate+(const String &s1, const String &s2)

{

String temp;

delete temp.data; // temp.data 是仅含‘\0’的字符串

temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];

strcpy(temp.data, s1.data);

strcat(temp.data, s2.data);

return temp;

}

对于相加函数,应当用“值传递”的方式返回String 对象。如果改用“引用传递”,

那么函数返回值是一个指向局部对象temp 的“引用”。由于temp 在函数结束时被自动

销毁,将导致返回的“引用”无效。例如:

c = a + b;

此时 a + b 并不返回期望值,c 什么也得不到,流下了隐患。

c++ 对象作为参数传递的更多相关文章

  1. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  2. 关于Java对象作为参数传递是传值还是传引用的问题

    前言 在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题.若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响:若传的是引用 ...

  3. python的raw_input()函数。 函数的可变对象和不可变对象作为参数传递。

    python的raw_input()函数, 接受键盘输入, 其返回值是字符串类型, 所以当输入的是数字时, 如果是想参与算术运算, 必须要对其进行类型转换. python的参数传递, 对于可变对象和不 ...

  4. Python踩坑:类与类对象类型参数传递与使用

    前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题. 不过,一旦用来开发稍 ...

  5. 我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑

    又是一道面试题,来测试你的Java基础是否牢固. 题目:以下代码的运行结果是? public class TestValue { public static void test(String str) ...

  6. jquery 在将对象作为参数传递的时候要转换成 JSON

    不转换成JSON 会报错  Unexpected identifier 方法: JSON.stringify(对象)

  7. spring cloud——feign为GET请求时的对象参数传递

    一.问题重现 楼主在使用feign进行声明式服务调用的时候发现,当GET请求为多参数时,为方便改用DTO对象进行参数传递.但是,在接口调用时feign会抛出一个405的请求方式错误: {"t ...

  8. C++ 类对象和 指针的区别

    C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...

  9. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

随机推荐

  1. Java内存模型-jsr133规范介绍

    原文地址:http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html; 近期在看<深入理解Java虚拟机:JVM高级特性与最佳 ...

  2. Delphi Excel FastReport

    unit Unit1; interface uses Printers,Windows, Messages, SysUtils, Variants, Classes, Graphics, Contro ...

  3. ios7 UIScrollView 尺寸问题

    假设在UINavigationController内设置一个UIViewControlller,而UIViewController的第一个子视图是UIScrollView的话,UIScrollview ...

  4. Migration data on SQL

    从表里面导出数据XML: -- export declare @xml xml set @xml = (select * from ( select TableName = 'Schema', xml ...

  5. U3D 自带navmesh自动寻路教学

    网易博客转载 博主:啊赵 unity自带寻路Navmesh入门教程(一) 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图 ...

  6. C# 微信公众平台开发(2)-- 微信菜单

    上一篇了解微信开发者中心 URL的配置验证: 验证成功后,就可以对获取的接口权限进行操作 自定义菜单接口可实现多种类型按钮,用的比较多的是 1.click:点击推事件 用户点击click类型按钮后,微 ...

  7. slots

    class Student(object): pass s = Student() s.name = 'Michael' print(s.name) def set_age(self, age): s ...

  8. C# 课堂总结3-语句

    一.顺序语句 二.条件,分支语句 1.if语句 关键是能够熟练运用 if的嵌套.要考虑好所有的情况. 如果说 条件是两种+情况相互对应的,那么就可以只用 if 与else .但必须要想好 每个else ...

  9. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

  10. createNewFile创建空文件夹与createTempFile创建临时文件夹

    创建要注意的地方如下: <pre name="code" class="java"> File类的createNewFile根据抽象路径创建一个新的 ...