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 << " " << "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 引用的更多相关文章
- Qt on Android 核心编程
Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著 ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- Python核心编程-闭包
百度搜了一下闭包的概念:简而言之,闭包的作用就是在外部函数执行完并返回后,闭包使得收机制不会收回函数所占用的资源,因为内部函数的执行需要依赖外函数中的变量.这是对闭包作用的非常直白的描述,不专业也不严 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- python核心编程第二版笔记
python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d 提供调试输出1.2 –O 生成优化的字节码(生成 ...
- 学习《Python核心编程》做一下知识点提要,方便复习(一)
学习<Python核心编程>做一下知识点提要,方便复习. 计算机语言的本质是什么? a-z.A-Z.符号.数字等等组合成符合语法的字符串.供编译器.解释器翻译. 字母组合后产生各种变化拿p ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
随机推荐
- Git(GitHub)配合TortoiseGit使用
1.首先下载安装配置Git 安装请参照 https://www.cnblogs.com/xueweisuoyong/p/11914045.html 配置请参照 https://www.jianshu. ...
- 接上一篇安装linux问题,解决redis安装后make test错误
(file "tests/helpers/bg_complex_data.tcl" line 10) Killing still running Redis server 3987 ...
- for循环操作(for...in、forEach)
1.for...in语句用于对数组或者对象的属性进行循环操作,是for循环的一种. 注意:该方法可用于数组或对象. 语法: for(变量 in 对象/数组){} 如: var obj = { nam ...
- C++模板使用
C++模板 模板是一种对类型进行参数化的工具: 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 例如:Max函数 :求两个数的最大值,我们需要对各种数据类型进行重载,如下 in ...
- Python实现Thrift Server
近期在项目中存在跨编程语言协作的需求,使用到了Thrift.本文将记录用python实现Thrift服务端的方法. 环境准备 根据自身实际情况下载对应的Thrift编译器,比如我在Windows系统上 ...
- NOIP模拟39:树
他们说这题与之前树剖的一道叫染色的题类似,好像真的是这样. 就是我们考虑这样一件事,就是每一次染白都可以看作是给链上的点打一个时间戳,那么可以发现,如果相邻的两个点的时间戳不同,那么他们之间的 ...
- QT之ARM平台的移植
在开发板中运行QT程序的基本条件是具备QT环境,那么QT的移植尤为重要,接下载我将和小伙伴们一起学习QT的移植. 一.准备材料 tslib源码 qt-everywhere-src-5.12.9.t ...
- MongoDB(14)- 查询 null 字段或缺少某个字段的文档
插入测试数据 db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ]) 后面的栗子都会用到这里的测试数据 查询匹配包含值为 nul ...
- 微信小程序开发正常,真机预览模式错误
原因是开发时设置了不检查域名是否合法,去后台设置上就可以了
- 查询同一张表符合条件的某些数据的id拼接成一个字段返回
同一张表存在类似多级菜单的上下级关系的数据,查询出符合条件的某些数据的id拼接成一个字段返回: SELECT CONCAT(a.pid, ',', b.subid) AS studentIDS FRO ...