c++入门之引用
引用通常被用在函数形参传递的过程中。一般的参数传递的过程:将实参进行拷贝,函数中都是对拷贝的变量进行操作,而不是对原变量进行操作。但很多情况下,我们都希望对原变量进行操作.(比如交换两个变量的数值)。下面先给出一段代码:
#include "iostream"
#include "string"
using std::string;
using std::cout;
struct free_throws{
string name;
int made;
int attempts;
float percent;
}; void display(const free_throws &ft);
void set_pc(free_throws &ft);
free_throws& accmulate(free_throws &target, const free_throws &source); int main()
{
free_throws one{ "alice", , };
free_throws two{ "jack", , };
free_throws three{ "robot", , };
free_throws four{ "lucy", , };
free_throws five{ "jeff", , };
free_throws team{ "lee", , };
free_throws dup;
set_pc(one);
display(one);
accmulate(team, one);
display(team);
display(accmulate(team, two));
accmulate(accmulate(team, three), four);
display(team);
system("pause");
return ;
} void set_pc(free_throws &ft)
{
if (ft.attempts != )
ft.percent = 100.0f*float(ft.made) / float(ft.attempts);
else
ft.percent = ;
}
void display(const free_throws &ft)
{
cout << "name:" << ft.name << "\n";
cout << "made" << ft.made << "\t";
cout << "attempts" << ft.attempts << "\t";
cout << "attempts" << ft.percent << "\t";
} free_throws &accmulate(free_throws &target, const free_throws &source)
{
target.attempts += source.attempts;
target.made = source.made;
set_pc(target);
return target;
}
上述代码:描述了引用变量在结构体中的应用,实际上,应用引用变量的地方多在较为复杂的数据结构中。
1.set_pc()的功能是修改结构体成员值(如果我们不采用引用变量,那么修改的将是拷贝的变量,而非原变量,当然我们也可以采用指针的方式)
2.display()的作用是显示结构体成员值,需要注意的是:这个程序的功能是显示结构体成员的值,也就是不对结构体成员作修改。因此引入了const 限定。const表明如果我们试图在函数函数中修改形参(这里是ft,也就是被传递的结构体,如one),那么就会出错。.
关于const的基本性质和原理不再赘述。说明一点:当要被传递的参数作为右值时(不被修改),为了程序的健壮性,通常我们会将参数设置为const类型
3 free_throws &accmulate(par1,par2)函数中的par1是被修改的,而par2是右值,因此定义成了const。但这个函数有趣的地方在于,帮我们重新认识了函数:思考什么是函数?
从组成结构上讲,函数包括了这几个点:函数名(函数的入口地址),函数形参类型及个数,函数的返回值类型(函数名前面的东西)。当每次遇到函数的时候,我们脑海里要形成对这三个属性的认识:函数名代表什么,函数的形参可以是什么类型?可以有多少个?返回值是什么类型??可以有多少个?
我们关注这个函数的返回值,发现,并不是我们熟悉的Int ,char ,double ,甚至是指针比如int *。这里返回的是结构体,确切的说是结构体引用。比如我们说指针类型的时候,我们会说int*.因此,我们需要将引用看成一个类型。这里是structname &类型。而我们发现,target变量自身就是structname &类型。我们发现,这是吻合的,其实仔细思考原来的,int ,char ,double 甚至指针,函数中被返回的变量的类型。和函数名前的返回类型是一致的!!!
4 引用必须在定义的时候进行初始化,函数传参也属于这一种情况。
c++入门之引用的更多相关文章
- C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现
首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...
- Ant入门之引用外部jar文件
笔者在java项目开发中经常遇到引用外部Jar包的情况,使用ant打包过程中需要对其引用.现在此简单记忆以飨来者. 此处引用Log4j,具体程序HelloLog4j.java: package oat ...
- EmitMapper系列之二:EmitMapper的使用小结
EmitMapper的入门 EmitMapper引用 EmitMapper案例 最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成. 在网上看到了Em ...
- 分布式事务框架.NetCore CAP总结
来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...
- 30分钟入门Java8之方法引用
30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method Referenc ...
- JdbcTemplae使用入门&&Spring三种连接池配置&&Spring配置文件引用外部properties文件
JdbcTemplate的使用 Spring为了各种支持的持久化技术,都提供了简单操作的模版和回调. JdbcTemplate 简化 JDBC 操作HibernateTemplate 简化 Hiber ...
- Swift入门(十)——循环引用、弱引用和无主引用
近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下. 和OC一样.Swfit默认也是基于ARC进行内存管理的,因此尽管简单 ...
- UWP入门(六)-- ResourceDictionary 和 XAML 资源引用
原文:UWP入门(六)-- ResourceDictionary 和 XAML 资源引用 你最希望声明为 XAML 资源的 XAML 元素包括 Style.ControlTemplate.动画组件和 ...
- Java 8函数编程轻松入门(四)方法引用
C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...
随机推荐
- 如何获取Azure AD tenant的tenant Id?
一般情况下,Azure AD用户知道自己tenant域名,因为域名是账户的后缀,例如:contoso.onMicrosoft.com.如果你还不了解什么是Azure AD tenant,可 ...
- Latch导致MySQL Crash
作者:沃趣科技数据库专家 董红禹 问题概述 最近我们遇到一个MySQL的问题,分析后很有代表意义,特地写出来供大家参考.出现问题是,数据库先是被置为只读,然后过了一段时间,MySQL直接Crash掉了 ...
- UGUI自定义组件之Image根据Text大小自动调整
需求分析 在之前的文章中,介绍到可以使用UGUI自带的ContentSizeFitter组件,进行Button根据Text的长度自适应, UGUI ContentSizeFitter之Button根据 ...
- VS2013 创建ASP.NET MVC 4.0 未指定的错误(异常来自HRESULT: 0x80004005(e_fail))
这个错误是真的头疼,尝试各种办法都没用,最后解决用的方法是: 找到 vs_ultimate.exe 修复文件,我的文件位置在 C:\ProgramData\Package Cache\{4d78654 ...
- C#语言のC#扩展方法(.Net特性)
this在C#中的常见用法:1.在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 2.也可以用this来做为参数状当前实例做为参数传入方法. 3 ...
- 7.01-beautiful_soup3
# pip install beautifulsoup4 from bs4 import BeautifulSoup html_doc = """ <html> ...
- 利用ENVI FX从RGB提取建筑物轮廓
在QQ热线或者技术咨询会问到:"我有一副RGB的栅格图,想从上面提取相关的一些信息.能不能提取?精度有保证吗?"等等诸如此类的问题.本专题就採用我们经常使用的栅格地图进行建 ...
- SecureCRT 使用 rz命令提示waiting to receive.**B0100000023be50
SecureCRT 远程连接Linux服务器,使用 rz命令提示waiting to receive.**B0100000023be50,或者使用sz命令提示: **B0100000023be50 解 ...
- [tool] AI视频翻译 解决英文视频字幕问题(类似youtube自动生成字幕)
1.网易见外是网易人工智能事业部旗下的AI视频翻译产品. 字幕支持手工编辑和下载 不过网易见外 只支持WEB在线操作 并且只支持单个上传操作 目前没有客户端 2.人人译视界 (IOS 安卓 PC客户端 ...
- P2689 东南西北
题目描述 给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地.求到达终点的最少时间. 如果无法偏移至终点,输出“-1”. 输入输出格式 输入格式: 第一行 ...