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++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有 ...
随机推荐
- 第十一章、Designer中主窗口QMainWindow类
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 主窗口对象是在新建窗口对象时,选择main window类型的模板时创建的窗口对象,如图: ...
- python zip()函数用法
zip() --内建函数 zip([iterable, ...]) 它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表) ...
- SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便
一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方案的速度 ...
- 【题解】折纸 origami [SCOI2007] [P4468] [Bzoj1074]
[题解]折纸 origami [SCOI2007] [P4468] [Bzoj1074] 传送门:折纸 \(\text{origami [SCOI2007] [P4468]}\) \(\text{[B ...
- CF1457D XOR-gun
这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\text{Trie}\) 加二分的两只 \(\log_2\) 的做法,发现不能 \(PP\) ,然后就一直改到比赛结束还没改过. 然后 ...
- 题解-Reachable Strings
题解-Reachable Strings 前置知识: \(\texttt{Hash}\) Reachable Strings 给一个长度为 \(n\) 的 \(\texttt{01}\) 串 \(s\ ...
- STL——容器(Set & multiset)的大小
1. set.size(); //返回容器中元素的数目 2. set.empty();//判断容器是否为空 empty() 是由一下代码实现的,可以发现,当长度为0时返回 false,以此判断容器为 ...
- Java 书单
Java 基础 <Head First Java> 有人说这本书不适合编程新手阅读?其实本书还是很适合稍微有一点点经验的新手来阅读的,当然也适合我们用来温故 Java 知识点. ps:刚入 ...
- Elasticsearch.Net
今天使用Elasticsearch作开发,很简单的查询,就出现Elasticsearch.Net.UnexpectedElasticsearchClientException异常,看样子像是序列化的异 ...
- js下 Day10、尺寸位置属性
一.元素尺寸信息 元素.offsetWidth: 元素的外宽高 width + padding + border 元素.offsetHeight: 元素的外宽高 height + padding + ...