参考: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. layui 下拉框不显示解决方法

    添加以下代码 layui.use('form', function(){ var form = layui.form; form.render(); });

  2. windows/browser ----> cmd命令/powershell命令/chrome插件vimuim命令

    windows 7 cmd常用命令: 1.进入某盘,比如d盘:d:(有一个冒号) 2.显示d盘的文件夹和文件:dir 3.进入d盘某个文件夹:cd filename 4.清除屏幕:cls 5.查看ip ...

  3. linux 如何释放缓存

    操作: 同步 sync 释放所有缓存 echo 3 > /proc/sys/vm/drop_caches 原理: sync 将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node.已延迟的 ...

  4. EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性

    创建动态查询 想在项目中实现一个灵活的动态查询类,参考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnb ...

  5. 关于JAVA项目中的常用的异常处理情况总结

    1. JAVA异常处理 在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行.比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0.在vb或delphi开发的应用程序中 ...

  6. 利用adb安装apk

    下载adb 网上资源很多,资源自寻. 配置环境变量 先加变量,后加入path.网上很多,不赘述. 安装apk 打开cmd,确保adb已经连接设备 adb install -r <拖动文件至cmd ...

  7. VS Code行内样式提示插件

    打开vscode,在软件界面左下角找到“齿轮”标志并点击,在弹出的菜单中选择“设置”,把下面的代码添加到设置里. { "workbench.colorTheme": "C ...

  8. linux中用户和用户组

    一.用户和组原理 一个用户可以属于多个组,一个组有多个用户 在Linux中操作系统必须依赖组和用户进行管理 二.与用户和组相关的配置文件 1.组相关配置文件 1)/etc/group :管理用户组信息 ...

  9. MySQL事务(二)

    一.事务的隔离级别/锁问题 基本的介绍: 当我们的mysql表,被多个线程或者客户端同时操作时,mysql提供一种机制,可以让不同的事务在操作数据时,具有隔离性. 锁是计算机协调多个进程或线程并发访问 ...

  10. Jupyter notebook 转 pdf [完整转换]