1. 引用的基本使用

作用:给变量起别名

语法数据类型 &别名 = 原名

#include<iostream>
using namespace std; int main(){
int a = 10;
int &b = a; cout << "a=" << a << endl;
cout << "b=" << b << endl; b = 20;
cout << "b=" << b << endl; return 0;
}

2. 引用的注意事项

  • 引用必须初始化

    • int &b;是错误的
  • 引用一旦初始化,就不可以更改了

3. 引用做函数参数

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

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

#include<iostream>
using namespace std; //交换函数 //1.值传递
void mySwap01(int a,int b){
int temp = a;
a = b;
b = temp;
} //2.地址传递
void mySwap02(int *a,int *b){
int *temp = *a;
*a = *b;
*b = *temp;
} //3.引用传递
void mySwap03(int &a,int &b){
int temp = a;
a = b;
b temp;
} int main(){
int a = 10;
int b = 20; mySwap01(a,b); //值传递,形参不会修饰实参
mySwap02(&a,&b); //地址传递,形参会修饰实参
mySwap03(a,b); //引用传递,形参会修饰实参 cout << "a=" << a << endl;
cout << "b=" << b << endl; return 0;
}

4. 引用做函数的返回值

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

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

用法:函数调用作为左值

#include<iostream>
using namespace std; //引用做函数的返回值
//1.不要返回局部变量的使用
int& test01() {
int a = 10; //局部变量存放在四区中的栈区
return a;
} //2.函数的调用可以作为左值
int& test02() {
static int a = 10; //静态变量存放在全局区,全局区的数据在程序结束后系统释放
return a;
}
int main() { int &ref = test01();
cout << "ref=" << ref << endl;
cout << "ref=" << ref << endl; int &ref2 = test02();
cout << "ref=" << ref2 << endl;
cout << "ref=" << ref2 << endl; test02() = 1000;
cout << "ref=" << ref2 << endl;
cout << "ref=" << ref2 << endl; system("pause");
return 0;
}

5. 引用的本质

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

//发现是引用,转换为int* const ref = &a;
void func(int& ref){
ref = 100; //ref是引用,自动帮转换为:*ref = 10
} int main(){
int a = 10; //自动转换为 int* const ref = &a;指针常量是指针指向不可改,也说明为什么引用不可改
int& ref = a;
ref = 20; //内部发现ref是引用,自动帮我们转换为:*ref = 10 cout << "a:" << a << endl;
cout << "ref:" << ref << endl; func(a);
return 0;
}

6. 常量引用

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

#include<iostream>
using namespace std; //打印数据函数
void showValue(const int &val) {
//val = 1000;
cout << "val = " << val << endl;
} int main() {
//常量引用
//使用场景:用来修饰形参,防止误操作 int a = 10;
//加上const之后,编译器将代码修改 int temp=10;const int& ref=temp;
//int & ref = 10; 非法
//const int & ref = 10;
showValue(a);
cout << "a = " << a << endl;
system("pause");
return 0;
}

C++学习(6)—— 引用的更多相关文章

  1. (转) 学习C++ -> 引用( References )

    学习C++ -> 引用( References ) 一.引用的介绍    引用就是某一变量(目标)的一个别名, 相当于同一个人有了两个名字, 无论喊哪一个名字实际上都是指的同一个人. 同样, 在 ...

  2. C++学习之引用

    C++学习之引用         临时变量.引用参数和const         现在,当参数为const引用的时候,如果实参与引用参数不匹配,C++将生成临时变量.C++将在下面两种情况下生成临时变 ...

  3. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  4. iOS学习——属性引用self.xx与_xx的区别

    在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性.但是一直有一个疑惑,那就是这两个之间有什么区别呢?最初我一直觉得这两个之间没什么区 ...

  5. Java学习之强引用,弱引用,软引用 与 JVM

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

  6. 我的c++学习(7)引用和复制构造函数

    一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...

  7. JVM学习之强引用、弱引用、软引用、虚引用

    转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...

  8. cocos2dx 3.0 学习笔记 引用cocostudio库 的环境配置

    cocostudio创建UI并应用时须要引用cocostudio库,须要额外的环境配置: 之前已经搭配好了基础的开发环境,包含 1) JDK 2) Python 2.7 3) ant 4) visua ...

  9. Lambda学习---方法引用和其他基本应用

    package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...

  10. java的Spring学习1--spring引用及属性(setter,getter)注入

    1.目录结构 项目->src->main->java->com.test.ppmoney 设置java文件夹为代码  在Project Structure 里的 Modules ...

随机推荐

  1. 分布式系统全局唯一ID生成

    一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...

  2. 【Gamma】 Phylab 展示博客

    目录 [Gamma] Phylab 展示博客 发布地址 网站:PhyLab GitHub Release: WhatAHardChoice/Phylab Gamma版本 一.团队简介 二.项目目标 2 ...

  3. Alpha冲刺(10/10)——2019.5.2

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  4. Java8实战及自己的总结

    java8 介绍 java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特性, ...

  5. [转帖]国产统一操作系统UOS龙芯版正式上线

    国产统一操作系统UOS龙芯版正式上线 2019/12/13 12:49:31来源:IT之家作者:骑士责编:骑士评论:446 https://www.ithome.com/0/462/725.htm   ...

  6. springboot处理date参数

    前言 最近在后台开发中遇到了时间参数的坑,就单独把这个问题提出来找时间整理了一下: 正文 测试方法 bean代码: public class DateModelNoAnnotation { priva ...

  7. Mysql系列(六)—— MySQL索引介绍

    前言 索引种类 索引维护 如何使用索引 一.索引索引种类 MySQL中索引主要包含以下几种: 普通索引 唯一索引 主键索引 联合索引 全文索引 二.索引维护 在简述了索引的类型后,再来了解下如何维护索 ...

  8. VSCode 命令

    淘宝 NPM 镜像     https://npm.taobao.org/ Ctrl+~   显示终端 npm start    启动项目 cnpm install   安装模块

  9. JS获取当前时间戳及时间戳的转换

    获取现在的Unix时间戳(Unix timestamp) Math.round(new Date().getTime()/1000)  //getTime()返回数值的单位是毫秒 Unix时间戳(Un ...

  10. IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”

    问题现象 IIS 7.5在绑定中文域名转码后,启动站点会出现[值不在预期的范围内]: 解决方案 此问题是由于中文域名绑定错误导致的,IIS 7.5针对中文域名会自动转换为punycode码,所以不需要 ...