引用的基本使用

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

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

引用做函数参数

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

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

实例:

#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. MFC 绘制坐标系

    主要讨论映射模式:MM_ANISOTROPIC,MM_ISOTROPIC.及相关方法的应用. 1,先建立一个MFC单文档,过程不再赘述. 2,在View类中找到CMainFrame::PreCreat ...

  2. MySQL列举常见的关系型数据库和非关系型都有那些?

    关系型数据库: Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQL 非关系型数据库: NoSql.Cloudant.MongoDb.redis ...

  3. 第一次实战:XX漫画的XSS盲打

    第一次实战:XX漫画的XSS盲打 XSS盲打 盲打是一种惯称的说法,就是不知道有没有XSS漏洞存在的情况下,不顾一切的输入XSS代码在留言啊投诉窗口啊之类的地方,尽可能多的尝试XSS的语句,就叫盲打. ...

  4. Servlet学习笔记(一)之Servlet原理、初始化、生命周期、结构体系

    Servlet是用java语言编写的应用到Web服务器端的扩展技术,与java对象的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持(以下会介绍原因, ...

  5. opengl中标准矩形像素点手动网格化为三角形条带的实现

    这里以一张矩形图片为例进行说明: 一张图片的像素点是孤立的,导入opengl中进行绘制出来,看起来没问题,但是当我们放大图片时候,显示的就是一个个孤立的点,而没有像看图软件放大图片那样看起来还是连续的 ...

  6. 如何实现LRU缓存?

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...

  7. openswan IPSec专栏目录锦集

    为了方便查阅现有的文章,特准备一个目录页供后续查询使用 专栏序言 1. 基础知识 openswan任务调度基础知识之信号 2. openswan环境搭建 openswan框架和编译时说明 opensw ...

  8. AQS深入分析

    一.node概念 1.当线程获取锁失败时,会被打包成一个node放到同步队列中 2.node属性 当线程获取锁失败时,会被打包成一个node放到同步队列中,所以node属性中有一个thread属性; ...

  9. Java学习笔记--注解和反射

    注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...

  10. Django学习day09随堂笔记

    每日测验 """ 今日考题: 1.choices参数的应用场景有哪些,如何获取该字段的值 2.django是什么模型的框架,简述MTV与MVC模型 3.多对多表关系有几种 ...