参考:http://www.weixueyuan.net/view/6338.html

总结:

  C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值、引用和指针的方式作为函数的参数或函数返回值。

  最好不要采用传值的方式传递和返回对象。  

  函数返回一个对象的引用的时候,最好该对象不是局部变量或临时变量。 

类是C++语言面向对象编程的载体,我们也可以将类视为一种特殊的数据类型。在C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值、引用和指针的方式作为函数的参数或函数返回值。

通常来讲,除非是迫不得已,否则最好不要采用传值的方式传递和返回对象,这是因为采用传值的方式传递和返回对象的过程中需要经历对象间的拷贝操作,这样会在一定程度上降低程序运行的效率,从而使得待处理数据量增大,增加内存的使用。而采用引用或指针的方式则不会有这样的问题,而实际上,因为引用表达更加简练直观,因此也较少使用指针来传递对象或作为函数返回值。

[例1] 对象引用举例:

  1. class book
  2. {
  3. ... ...
  4. };
  5. book Alice;
  6. book &Alice_reference = Alice;

对象的引用和普通的变量引用基本语法是一样的。如例1所示,先定义了book类,之后定义了book类对象Alice,最后一句定义了Alice_reference是Alice对象的引用。

[例2] 通过引用的方式来传递和返回对象:

#include<iostream>
using namespace std; class book
{
public:
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
private:
double price;
char * title;
}; void book::setprice(double a)
{
price = a;
} double book::getprice()
{
return price;
} void book::settitle(char* a)
{
title = a;
} char * book::gettitle()
{
return title;
} void display(book & b)
{
cout<<"The price of "<<b.gettitle()<<" is $"<<b.getprice()<<endl;
} book & init(char *t, double p)
{
static book b;
b.settitle(t);
b.setprice(p);
return b;
} int main()
{
book Alice;
Alice.settitle("Alice in Wonderland");
Alice.setprice(29.9);
display(Alice);
book Harry;
Harry = init("Harry Potter", 49.9);
display(Harry);
return 0;
}

在本例中,我们继续沿用之前定义的book类,只不过类中新增添了title这个成员变量,为了能够操控title变量,我们与之相对应地新增了两个public属性的成员函数settitle和gettitle,这两个函数都是在类内部声明,类外部定义的。

之所以将成员函数都放到类外定义主要是为了使得类定义看起来简洁明了,类中定义了哪些成员变量,哪些成员函数,一目了然。

除了定义book类以外,我们还定义了两个函数,一个是display函数,其参数为book类对象的引用;另一个函数是init函数,其返回值是book类对象的引用。这两个函数前者是为了打印图书的书名及价格信息,后者则是为了初始化对象。

我们来看一下主函数,首先用book类定义了一个Alice对象,并且调用settitle和setprice函数分别设置Alice对象的相关成员变量,之后调用顶层函数display,打印Alice对象的相关信息。

在此之后,我们又定义了一个Harry对象,该对象直接调用顶层函数init来进行初始化,经过init函数内部初始化后,将对象的引用返回给Harry对象,最终同样调用display函数打印Harry对象的相关信息。

程序最终运行结果如下:
The price of Alice in Wonderland is $29.9
The price of Harry Potter is $49.9

这个例子向我们展示了通过引用的方式来传递和返回对象,需要注意的是函数返回一个对象的引用的时候,最好该对象不是局部变量或临时变量(如果是局部变量或临时变量,一旦该函数运行结束,该局部变量或临时变量很有可能会被系统销毁),如本例中init函数在定义b对象时前面加上了一个static关键字,将b对象声明为一个静态对象。

2.6 C++通过引用来传递和返回类对象的更多相关文章

  1. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

  2. JS 中没有按地址(引用)传递,只有按值传递

    很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...

  3. php 数组 类对象 值传递 引用传递 区别

    一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...

  4. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  5. React + TypeScript:元素引用的传递

    React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...

  6. java传递是引用的拷贝,既不是引用本身,更不是对象

    java传递是引用的拷贝,既不是引用本身,更不是对象 2008-09-16 04:27:56|  分类: Java SE|举报|字号 订阅     下载LOFTER客户端     1. 简单类型是按值 ...

  7. [转载]php 数组 类对象 值传递 引用传递 区别

    一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...

  8. Swift 关键字 inout - 让值类型以引用方式传递

    两种参数传递方式 值类型 传递的是参数的一个副本,这样在调用参数的过程中不会影响原始数据. 引用类型 把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据. 在 Swift 众多数据类型中, ...

  9. delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数

    //delphi中exit,abort,break,continue 的区别 exit: 退出函数体abort: 遇到异常,安静处理,就是不显示不提示break: 退出当前循环体,包括for ,whi ...

随机推荐

  1. (25)线程---local数据隔离

    线程之间本身是数据共享的,当多个线程同时修改一份数据的时候,数据就可能不 准确,特别是线程量特别大的时候,为了保证数据准确性: (1) 通过线程锁Lock (2)通过local数据隔离 from th ...

  2. putty 显示 ubuntu的文件乱码

    http://www.linuxidc.com/Linux/2012-01/52252.htm 下面几个注意点 1) Windows - Appearance - Font settings 里可以更 ...

  3. django-simple-captcha 验证码插件介绍 django-simple-captcha 使用 以及添加动态ajax刷新验证

    django-simple-captcha作为一款django的验证码插件,使用方法非常简单,能够快速应用到web应用中. 文档官网地址:django-simple-captcha 参考博客:http ...

  4. 开发者说 | Apollo控制算法之汽车动力学模型和LQR控制

    参考:https://mp.weixin.qq.com/s?__biz=MzI1NjkxOTMyNQ==&mid=2247486444&idx=1&sn=6538bf1fa74 ...

  5. 彻底搞懂 CPU 中的内存结构

    https://www.cnblogs.com/YJK923/p/10302180.html

  6. ionic3 打包一个已签名的apk

    1 进入ionic官方文档,点击左边导航菜单,找到INTRO下的Deploying2 终端进入项目目录(根据项目环境定是否需要root权限)3 运行命令ionic cordova build andr ...

  7. linux文件管理之bash shell

    BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...

  8. Confluence 6 文档主题合并问答

    在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用.我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将 ...

  9. es的分词器analyzer

    analyzer   分词器使用的两个情形:  1,Index time analysis.  创建或者更新文档时,会对文档进行分词2,Search time analysis.  查询时,对查询语句 ...

  10. appium+python+unittest+HTMLRunner编写UI自动化测试集

    简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以py ...