2. C++中的引用
1. 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名=原名
注意:
别名数据类型与原名数据类型一致。
引用必须初始化。
引用一旦初始化后,就不可以更改(只能作为一个变量的别名)
一个变量可取多个别名,即可定义多个引用变量作同一个变量的别名
int a =10;
int &b=a; //int &b;代码是错误的必须初始化
//引用在初始化后,不可以改变
int c= 20;
b=c; //赋值操作,而不是更改引用。
2. 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改参数
#include <iostream>
using namespace std;
//交换函数
//1. 值传递:形参不会修饰实参
void swap1 (int a,int b)
{
int temp = a;
a=b;
b=temp;
cout << "swap1 a =" << a <<endl;
cout << "swap1 b =" << b <<endl;
} //2. 地址传递:形参会修饰实参
void swap2(int *a,int *b)
{
int temp = *a;
*a=*b;
*b=temp;
} //3. 引用传递:形参也修饰实参
void swap3(int &a,int &b) //&a相当于下面a的别名
{
int temp = a;
a=b;
b=temp;
cout << "swap1 a =" << a <<endl;
cout << "swap1 b =" << b <<endl;
} int main()
{
int a=10;
int b=20; swap1(a,b); //值传递调用
cout << " a =" << a <<endl;
cout << " b =" << b <<endl; swap2(&a,&b); //地址传递
cout << " a =" << a <<endl;
cout << " b =" << b <<endl; swap3(a,b); //引用传递
cout << " a =" << a <<endl;
cout << " b =" << b <<endl;
system("pause");
return 0;
}
通过引用参数产生的效果同按地址传递是一样的。
3. 引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:如果函数的返回值是引用,函数调用可以作为左值
作为函数返回值格式如下:
返回类型& 函数名(形参列表及类型说明){函数体}
#include <iostream>
using namespace std;
//1. 不要返回局部变量引用
int& test1()
{
int a=10;
return a;
} //2. 函数调用可以作为左值
int& test2()
{
static int a=10; //静态变量,存放在全局区,程序结束后系统自动释放
return a;
} int main()
{
int &ref1 = test1();
cout <<"ref =" <<ref <<endl; //第一次结果正确,是因为编译器做了保留
cout <<"ref =" <<ref <<endl; //第二次结果错误,是因为a的内存释放 int &ref2 = test2();
cout << "ref2 =" <<ref2 <<endl; test2()=1000; //如果函数的返回值是引用,函数调用可以作为左值
cout << "ref2 =" <<ref2 <<endl;
system("pause");
return 0;
}
4. 引用的本质
本质:引用的本质在c++内部实现是一个指针常量(请区别与常量指针)
ps:指针常量:指向不可改变,值可以改变;常量指针:指向可以改变,值不可以改变;
5. 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加 const 修饰形参,防止形参改变实参
int a = 10;
//加上const之后,编译器将代码修改 int temp=10;const int &ref =temp; const int &ref =10;
//引用必须引一块合法的内存空间,int &ref=10;是错误的。
//加入const之后变为只读,不可修改
2. C++中的引用的更多相关文章
- php中关于引用(&)详解
php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...
- 浅谈Java中的引用
在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 Debug ...
- c++中的引用与指针的区别
http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...
- CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...
- 转 mvc项目中,解决引用jquery文件后智能提示失效的办法
mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法 这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...
- 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例
内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- VB6中的引用传递 与 VB.NET中的引用传递的区别
首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...
- [转] 深入探讨C++中的引用
引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有 ...
随机推荐
- PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<windows下使用pyinstaller将多个目录的Pyt ...
- 第11.12节 Python元字符“|”支持的正则表达式多选一匹配模式
re模块支持多个正则表达式使用"|"(逻辑或)模式来组合,扫描目标字符串时, '|' 分隔开的正则表达式组合从左到右进行匹配,只要其中一个匹配成功就认为该组合匹配成功,不再进行组合 ...
- 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>介绍了BeautifulSoup对象的主要属性,通过这些属性可以访 ...
- PyQt学习随笔:Model和View之间的数据互动过程
在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...
- ajax的五种状态
ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接 ...
- 什么时候使用transition?什么时候使用animation?
不同点: 1. 触发条件不同.transition通常和hover等事件配合使用,由事件触发.animation则和gif动态图差不多,立即播放. 2. 循环. animation可以设定循环次数. ...
- 能否让APP永不崩溃—小光与我的对决
前言 关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生的异常,然后再进行处理. 于是,我有了一个不成熟的想法.. ...
- STL—— 容器(vector)元素的删除
1. clear() 将整个 vector 都删除 使用 vectorname.clear() 可以将整个vector 中的元素全部删除,但是内存不会释放,如下代码: 1 #include <i ...
- 剑指Java高效编程教程
教程介绍 所谓"武以快为尊,天下武功唯快不破".本课程剑指Java高效编程,致力于从"技术"和"工具"两大 维度提高编程效率,帮助广大程序员 ...
- Mybatis执行流程源码分析
第一部分:项目结构 user_info表:只有id和username两个字段 User实体类: public class User { private String username; private ...