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++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有 ...
随机推荐
- 第二十七章、containers容器类部件QTabWidget选项窗部件详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- Oracle10g安装
1.下载链接:https://pan.baidu.com/s/1peD3iCTcE2Gg2cPNGLmLgQ 提取码:tjk4 一.ORACLE安装 WIN7.WIN10系统安装需要修改兼容性. 点击 ...
- C# 继承类的值赋
C# 继承类的值赋 /// <summary> /// 将父类的值赋值到子类中 /// </summary> /// <typeparam name="TPar ...
- CF1373F Network Coverage
题目链接 对于每一个 \(i\) 可以看作一个管道.赋予三个信息: \(\text{minIn}_i\) 表示至少要从上一家 \(i - 1\) 得到连接数,才能正常供给 \(i\) 城市 \(\te ...
- 算法——1~n 整数中 1 出现的次数
输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. leetcode 解题思路:依次遍历每一 ...
- Angular:惰性加载的模块
①通过ng new angular-module创建一个全新的angular应用,默认不选路由 ②通过一下命令分别创建2个模块和1个组件 ng g m hx1 ng g c hx1 ng g m hx ...
- 三、Jmeter发送请求
Jmeter的使用例子,发送一个get请求 1.打开Jmeter,选中Test Plan右键 选择 "添加"--"线程(用户)"--"线程组" ...
- SpringBoot集成基于tobato的fastdfs-client实现文件上传下载和删除
1. 简介 基于tobato的fastdfs-client是一个功能完善的FastDFS客户端工具,它是在FastDFS作者YuQing发布的客户端基础上进行了大量的重构,提供了上传.下载.删除. ...
- MySQL数据库死锁分析
背景说明: 公司内部一套自建分布式交易服务平台,在POC稳定性压力测试的时候出现了数据库死锁.(InnoDB引擎)由于保密性,假设是app_test表死锁了. 现象: 发生异常:Deadlock fo ...
- 网络知识扫盲——DNS
参考文章链接 : https://baijiahao.baidu.com/s?id=1668393227924896391&wfr=spider&for=pc 一.DNS 是什么? ...