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++中的引用的更多相关文章

  1. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  2. 浅谈Java中的引用

    在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...

  3. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

    MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 Debug ...

  4. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  5. CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4

    CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...

  6. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法

    mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法   这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...

  7. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  8. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  9. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  10. [转] 深入探讨C++中的引用

    引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有 ...

随机推荐

  1. Python中format_map与format字符串格式化的区别

    在Python3中使用format和format_map方法都可以进行字符串格式化,但format是一种所有情况都能使用的格式化方法,format_map仅使用于字符串格式中可变数据参数来源于字典等映 ...

  2. 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息

    利用urllib.request读取url文档的内容并使用BeautifulSoup解析后,可以通过一些基本的BeautifulSoup对象输出html文档的基本信息.以博文<第14.6节 使用 ...

  3. 快速排序(c++,递归)quick_sort

    放上c++代码,模板 1 #include <iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 5 in ...

  4. JQuery获取父,子,兄弟节点

    jQuery.parent(expr) // 查找父节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent ...

  5. Day1-7【Scrum 冲刺博客集合】

    Day1-Day7博客链接 Day1[Scrum 冲刺博客] Day2[Scrum 冲刺博客] Day3[Scrum 冲刺博客] Day4[Scrum 冲刺博客] Day5[Scrum 冲刺博客] D ...

  6. THE BUG 队第一次团队项目作业

    队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,3118005123 ...

  7. Vue 的响应式原理中 Object.defineProperty 有什么缺陷?为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty?

    Object.defineProperty无法监控到数组下标的变化,导致通过数组下标添加元素,不能实时响应: Object.defineProperty只能劫持对象的属性,从而需要对每个对象,每个属性 ...

  8. 介质访问控制子层-Medium Access Control Sublayer:多路访问协议、以太网、无线局域网

    第四章 介质访问控制子层-Medium Access Control Sub-layer 4.1介质访问控制子层概述 MAC子层不属于之前提到的OSI或TCP/IP架构的任何一层,这也是为什么这一层被 ...

  9. sqli-labs less8-10(布尔盲注时间盲注)

    less-8 布尔盲注 首先利用?id=1' and 1=1 --+和?id=1' and 1=2 --+确定id的类型为单引号''包裹.然后进行盲注. 盲注思路: 破解当前数据库名: and len ...

  10. MySQL最经典50道练习题

    表名和字段 学生表 Student(s_id,s_name,s_birth,s_sex):学生编号.学生姓名.出生年月.学生性别. 课程表 Course(c_id,c_name,t_id):课程编号. ...