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. JS中 (function(){...})()立即执行函数

    (function(){...})() (function(){...}()) 这是两种js立即执行函数的常见写法. 基本概念: 函数声明:function fname(){...}; 使用funct ...

  2. Linux将一个文件夹或文件夹下的所有内容复制或移动到另一个文件夹

    1.将一个文件夹下的所有内容复制到另一个文件夹下 cp -r /home/packageA/* /home/cp/packageB/ 或 cp -r /home/packageA/. /home/cp ...

  3. Centos目录及其常用处理命令

    1.Centos之常见目录作用介绍[1] 我们先切换到系统根目录 / 看看根目录下有哪些目录 [root@localhost ~]# cd / [root@localhost /]# ls bin   ...

  4. CentOS 7.6 安装Python3.7.2 多版本共存

    CentOS 7.6 默认安装了 Python 2.7.5 准备环境 yum install git gcc gcc-c++ make automake autoconf libtool pcre p ...

  5. 避免因为Arcgis Server服务设置不当导致Oracle Process溢出的方法

    我之前写过一篇文章<arcsoc进程无限增长导致oracle processes溢出>(见链接:https://www.cnblogs.com/6yuhang/p/9379086.html ...

  6. jquery swipper插件的一些弊端

    jquery swipper插件的一些弊端touch触摸机制是swipper的 阻止click冒泡.拖动Swiper时阻止click事件.下面这个方法或许可以解决触摸机制的问题 <pre> ...

  7. mapreduce 变量共享

    mapreduce 全局变量共享 在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce ...

  8. 【转】JavaScript 高性能数组去重

    原文地址:https://www.cnblogs.com/wisewrong/p/9642264.html 一.测试模版 数组去重是一个老生常谈的问题,网上流传着有各种各样的解法 为了测试这些解法的性 ...

  9. C语言 宏定义的1<<0 与 直接定义1 有什么区别

    [1]示例程序 如下示例代码: #include <stdio.h> #define TEST1 1 << 0 #define TEST2 (1 << 0) #de ...

  10. Effective.Java第12-22条

    12.  始终重写toString()方法 如果不重写toString()方法,打印的时候是 类名+@+哈希码的无符号十六进制.我们查看 Object的toString()方法如下: public S ...