2.6 C++通过引用来传递和返回类对象
参考:http://www.weixueyuan.net/view/6338.html
总结:
C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值、引用和指针的方式作为函数的参数或函数返回值。
最好不要采用传值的方式传递和返回对象。
函数返回一个对象的引用的时候,最好该对象不是局部变量或临时变量。
类是C++语言面向对象编程的载体,我们也可以将类视为一种特殊的数据类型。在C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值、引用和指针的方式作为函数的参数或函数返回值。
通常来讲,除非是迫不得已,否则最好不要采用传值的方式传递和返回对象,这是因为采用传值的方式传递和返回对象的过程中需要经历对象间的拷贝操作,这样会在一定程度上降低程序运行的效率,从而使得待处理数据量增大,增加内存的使用。而采用引用或指针的方式则不会有这样的问题,而实际上,因为引用表达更加简练直观,因此也较少使用指针来传递对象或作为函数返回值。
[例1] 对象引用举例:
- class book
- {
- ... ...
- };
- book Alice;
- 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++通过引用来传递和返回类对象的更多相关文章
- java方法强制传递引用参数(做为返回值),改变被传递参数值。
Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...
- JS 中没有按地址(引用)传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- php 数组 类对象 值传递 引用传递 区别
一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
- React + TypeScript:元素引用的传递
React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...
- java传递是引用的拷贝,既不是引用本身,更不是对象
java传递是引用的拷贝,既不是引用本身,更不是对象 2008-09-16 04:27:56| 分类: Java SE|举报|字号 订阅 下载LOFTER客户端 1. 简单类型是按值 ...
- [转载]php 数组 类对象 值传递 引用传递 区别
一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...
- Swift 关键字 inout - 让值类型以引用方式传递
两种参数传递方式 值类型 传递的是参数的一个副本,这样在调用参数的过程中不会影响原始数据. 引用类型 把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据. 在 Swift 众多数据类型中, ...
- delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数
//delphi中exit,abort,break,continue 的区别 exit: 退出函数体abort: 遇到异常,安静处理,就是不显示不提示break: 退出当前循环体,包括for ,whi ...
随机推荐
- 怎么从bam文件中提取出比对OR没比对上的paired reads | bamToFastq | STAR
折腾这么多都是白瞎,STAR就有输出没有别对上的pair-end reads的功能 参见:How To Filter Mapped Reads With Samtools I had the same ...
- Linux ----> debian中环境的常见配置
环境: (debian 9)/(lubuntu18.0.4+virtualbox) 1.配置下载源: gedit /etc/apt/sources.list #163 deb http://mirro ...
- (GoRails)使用vue和Vuex管理嵌套的JavaScript评论, 使用组件vue-map-field
嵌套的JavaScript评论 Widget Models 创建类似https://disqus.com/ 的插件 交互插件: Real time comments: Adapts your site ...
- python基础之小数据池,is和==区别 编码问题
主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...
- Dubbo简介---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- loj#2020. 「AHOI / HNOI2017」礼物
题意:给定xy数组求 \(\sum_{i=0}^{n-1}(x_i+y_{(i+k)\modn}+c)^2\) 题解:先化简可得 \(n*c^2+2*\sum_{i=0}^{n-1}x_i-y_i+\ ...
- IE的“浏览器模式”和“文档模式的区别”
1.浏览器模式 用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给网站服务器的用户代理(User_Agent)字符串的值.网站可以根据浏览器返回的不同用户代理字符串判断浏览器 ...
- SpringBoot项目Shiro的实现(二)
在看此小节前,您可能需要先看:http://www.cnblogs.com/conswin/p/7478557.html 紧接上一篇,在上一篇我们简单实现了一个Springboot的小程序,但我们发现 ...
- using强制对象清理资源 【转】
转 http://www.cnblogs.com/Legolas/p/detail-of-using.html using肯定所有人都用过,最简单的就是使用using引入命名空间,然后就是引入别名,简 ...
- java集合类整理
LinkedList 优点:插入删除迅速 缺点:不适合随机访问 List<String> staff = new LinkedList<String>(); staff.add ...