引用的基本使用

作用:给变量起别名 ,语法:数据类型 & 别名 = 原名

注意:引用必须初始化,且初始化之后,就不可更改、

引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

实例:

#include<iostream>
using namespace std; //交换函数 //1、值传递
void Swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
//cout << "Swap1 a=" << a << " " << "Swap1 b=" << b << endl; //值传递
} //2、地址传递
void Swap2(int * a, int * b)
{
int temp = *a;
* a = * b;
* b = temp;
//cout << "Swap2 a=" << *a << " " << "Swap2 b=" << *b << endl; //地址传递
} //3、引用传递
void Swap3(int &a , int &b)
{
int temp = a;
a = b;
b = temp;
cout << "Swap3 a=" << a << " " << "Swap3 b=" << b << endl; //引用传递
} int main()
{
int a = 10;
int b = 20; //Swap1(a, b); //值传递,形参不会修饰实参
//cout << "a=" << a << " " << "b=" << b << endl; //值传递打印:a=10,b=20 //Swap2(&a, &b); //地址传递,形参会修饰实参
//cout << "a=" << a << " " << "b=" << b << endl; //地址传递打印:a=20,b=10 Swap3(a, b); //引用传递,形参会修饰实参
cout << "a=" << a << " " << "b=" << b << endl; //引用传递打印:a=20,b=10

system("pause");
return 0;
}

总结:通过引用参数产生的效果同地址传递是一样的,引用的语法更清晰简单

引用做函数返回值

作用:引用是可以作为函数的返回值存在的。用法:函数调用作为左值

注意:不要返回局部变量引用

实例:

#include<iostream>
using namespace std; //引用做函数的返回值
//1、不要返回局部变量的引用
int& test1()
{
int a = 10; //局部变量存放在四区中的 栈区
return a;
} //2、函数的调用可以作为左值
int& test2()
{
static int a = 10; //加上关键字static ,局部变量a就变成了静态变量;静态变量存放在全局区,全局区的数据在程序结束后由系统释放
return a;
} int main()
{
//int &ref = test1(); //cout << "ref=" << ref << endl; //第一次结果正确,是因为编译器做了一次保留
//cout << "ref=" << ref << endl; //第二次结果错误,是因为 栈区 中存放的 局部变量 a 的内存已经被释放 int& ref = test2(); cout << "ref=" << ref << endl; //ref=10
cout << "ref=" << ref << endl; //ref=10 test2() = 1000; //如果函数的返回值是引用,函数的调用可以作为左值 cout << "ref=" << ref << endl; //ref=1000
cout << "ref=" << ref << endl; //ref=1000 system("pause");
return 0;
}

引用的本质:

     引用的本质在C++内部实现是一个指针常量

实例:

结论:C++推荐使用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

常量引用:

作用:常量引用主要是用来修饰形参,防止误操作

    在函数形参列表中,可以加const修饰形参,防止形参改变实参

实例:

#include<iostream>
using namespace std; //常量引用
//主要是用来修饰形参,防止误操作 void ShowVal(const int &val)
{
//val = 1000;
cout << "val=" << val << endl;
} int main()
{
//int a = 10;
//int& ref = 10; //引用必须引一块合法的内存空间
const int & ref = 10; //加上const后 编译器将代码修改 int temp = 10; int & ref = temp;
//ref = 20; //加入const之后 变为只读,不可修改 int a = 100;
ShowVal(a);
cout << "a=" << a << endl; system("pause");
return 0;
}

C++核心编程 2 引用的更多相关文章

  1. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

  2. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  3. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  4. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  5. Python核心编程-闭包

    百度搜了一下闭包的概念:简而言之,闭包的作用就是在外部函数执行完并返回后,闭包使得收机制不会收回函数所占用的资源,因为内部函数的执行需要依赖外函数中的变量.这是对闭包作用的非常直白的描述,不专业也不严 ...

  6. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  7. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  8. 学习《Python核心编程》做一下知识点提要,方便复习(一)

    学习<Python核心编程>做一下知识点提要,方便复习. 计算机语言的本质是什么? a-z.A-Z.符号.数字等等组合成符合语法的字符串.供编译器.解释器翻译. 字母组合后产生各种变化拿p ...

  9. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

随机推荐

  1. JavaWeb之数据库连接池

    时间:2016-12-2 23:56 --DBCP连接池连接池参数(所有连接池参数都有默认值):    初始大小    最小空闲连接数    增量    最大空闲连接数    最大连接数    最长等 ...

  2. Spring Data JPA:解析JpaSpecificationExecutor & Specification

    源码 在前面关于SimpleJpaRepository的文章[地址]中可以得知,SimpleJpaRepository间接实现了JpaSpecificationExecutor接口,本文就详细探究一下 ...

  3. redis《三》连接池配置参数

    参数 值 setTestWhileIdle() 在空闲时检查有效性 true setMinEvictableIdleTimeMillis() 连接最小空闲时间 1800000L setTimeBetw ...

  4. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  5. 存储系统管理(一)——Linux系统的设备和分区管理

    1.设备名称的理解 /dev/sda1? sata硬盘,a1表示第一块硬盘中的第一个分区 /dev/cdrom 光驱 /dev/mapper/*? 系统中的虚拟设备 2.发现系统中的设备 ? fdis ...

  6. vue+element+echarts饼状图+可折叠列表

    html: <div id="echartsDiv" style="width: 48%; height: 430px; float: left;"> ...

  7. MySQL高级语句(一)

    一.MySQL高级进阶SQL 语句 1.SELECT 2.DISTINCT 3.WHERE  4.AND.OR 5.IN 6.BETWEEN 7.通配符.LIKE 8.ORDER BY 9.| | 连 ...

  8. Haproxy搭建web集群

    目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...

  9. [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略

    [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 目录 [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 0x00 摘要 0x01 流水线比 ...

  10. Alibaba《Java开发手册》之Java代码规范笔记

    前言 一种工具被发明出来,那么针对这种工具的各种使用规则.条条框框就随之而来.无规矩不成方圆,无制度则无国家,无风格不成代码!治国有国法.排兵布阵有章法.那么写代码也有它界内通用的不成俗的约定.最近刚 ...