参考: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. VMware vSphere client 中英文语言界面设置

    安装的时候可以选择简体中文,然后安装后,对vsphere client的执行程序制作快捷方式 以win7 x64环境默认路径为例 英文启动如下: "C:Program Files (x86) ...

  2. spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关)

    spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关) zuul: routes: #路由配置表示 myroute1: #路由名一 path: ...

  3. C#使用 System.Net.Mail发送邮件功能

    .NET 里包含了很多很丰富的邮件发送与接受的API在 System.Net.Mail命名空间里,使得我们开发发送和接受邮件相关功能变得简单,下面是一个简单发送邮件的功能: private void ...

  4. Web3.js 0.20.x API 中文版翻译

    文档原始链接为:https://web3.learnblockchain.cn/0.2x.x/,欢迎大家前往查阅,本文只是节选开头部分的介绍及API列表索引,以下为翻译正文: 为了开发一个基于以太坊的 ...

  5. DAG最长路问题 hdu-1224

    用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostre ...

  6. android -------- Data Binding的使用 RecyclerView

    今天来说说DataBinding在列表RecyclerView中的使用 列表绑定 App中经常用到列表展示,Data Binding在列表中一样可以扮演重要的作用,直接绑定数据和事件到每一个列表的it ...

  7. 启动mysql5.7异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案

    异常表现 mysql5.7启动时报错 Starting MySQL...The server quit without updating PID file [FAILED]sql/data/insta ...

  8. es的mapping设置

    自定义mapping的api PUT test_index { "mappings": { #mappings关键字 "doc": { #type " ...

  9. 进程锁,队列,JoinableQueue

    内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...

  10. canvas移动端兼容性问题总结

    项目简介:在网页利用canvas在图片中动态绘制文字,合成一张图片,并导出 遇到的问题: 1.在移动端canvas drawImage()方法图片无法绘制出来,只显示文字 原因:图片未加载就进行绘制, ...