一:引用概念---引用就是为一个变量起一个别名

每个变量都是指向一块内存空间的标识,引用就是重新设置一个标识,但是这个标识还是指向同一个内存空间

和指针类似(其实引用本质就是使用了一个常指针 const int* b; 可修改内存值,不可修改指针地址),都可以直接操作同一块内存
但是引用的可读性更好,在一些场合可以代替指针

二:简单使用(同指针一起)

//1.值传递
void swap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
} //2.指针传递
void swap02(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
} //3.引用传递
void swap03(int& a, int& b)
{
int temp = a; //可读性好些
a = b;
b = temp;
} void main()
{
int a1 = , b1 = ;
int a2 = , b2 = ;
int a3 = , b3 = ; swap01(a1, b1);
swap02(&a2, &b2);
swap03(a3, b3); cout << "值传递:" << a1 << " " << b1 << endl;
cout << "指针传递:" << a2 << " " << b2 << endl;
cout << "引用传递:" << a3 << " " << b3 << endl; system("pause");
return;
}

三:函数返回值涉及引用

(一)当函数返回值为引用(局部变量的引用)

int& getRef()  
{
int a = ;
cout << &a << endl;
return a; //这是局部变量,一般会在函数结束后被释放栈空间
//但是若是返回的类型是引用,则会将该变量保留    <<重点>>
//类似其他语言中,只有当该内存空间无变量指向时,才会被回收  <<重点>>
//但是返回引用,则说明,将有其他变量指向该内存空间,不允许回收,延长了生命周期  <<重点>>

}
void main()
{
int a = getRef(); //相当于直接传值出来
cout << &a << " " << a << endl; int &b = getRef(); //将b指向局部变量a的地址,延长了变量生命周期 //注意使用引用来接收int &b,那么该函数返回类型必须是引用int& getRef
cout << &b << " " << b << endl; system("pause");
return;
}

(二)当函数返回值为引用(static变量的引用)

由于static变量的生命周期是当前文件,故不局限于某个函数。
---既可以作为其他引用的初始值,还可以作为左值进行使用
int& getRef()
{
static int a = 10;
cout << &a << endl;
return a;
} void main()
{
int &b = getRef(); //将b指向局部变量a的地址,延长了变量生命周期
cout << &b << " " << b << endl; getRef() = 15; //允许作为左值使用
cout << &b << " " << b << endl; system("pause");
return;
}

(三)当函数返回值为引用(返回值是形参) //相当于(一)局部变量,这里用于连接内存和引用

引用归根到底还是对内存的新标识
int& g2(int* p)
{
*p = ;
cout << p << endl;
return *p;  //看返回的是一个值,实际该值存放的内存还是和a1内存是一致的,返回的引用地址也就是这个内存地址
} void main()
{
int a1 = ;
cout << &a1 << " " << a1 << endl; int& a2 = g2(&a1);  //a2指向返回的内存地址引用 cout << &a2 << " " << a2 << endl; system("pause");
return;
}

(四)当函数返回值为引用(对象的引用,涉及拷贝构造函数和=操作符重载)---需要补充

四:常引用const

(一)使用变量初始化const引用---会将该 引用变量 变为只读

正常使用

尝试修改局部变量

尝试修改引用变量

(二)常用在为他人提供接口,同C++回顾day01---<const常量重点>

设置变量内存为只读,不允许使用接口的用户进行数据修改,只可以进行数据读取
void ReadOnly(const int& a)
{
cout << &a << " " << a << endl;
//a = 110; //不允许修改
} void main()
{
int a1 = ;
ReadOnly(a1); a1 = ;
ReadOnly(a1);
}

四:匿名对象引用(重点:https://www.cnblogs.com/ssyfj/p/10627359.html

class Test
{
private:
int a, b;
public:
Test(int a, int b)
{
this->a = a;
this->b = b;
} void getInfo()
{
cout << a << " " << b << endl;
}
}; Test func1()
{
return Test(, ); //匿名对象1
}
void main()
{
Test T = func1(); //直接将匿名对象用来初始化同类型对象
//会直接将匿名对象设置为这个新的对象
//即匿名对象1没有释放,而是直接变为T对象

cout << &T << endl;
T.getInfo();
system("pause");
}

Test& func2()
{
return Test(, ); //匿名对象2
} void main()
{
Test T = func2(); //使用匿名对象来初始化,会直接将匿名对象转变为这个对象T,延长生命周期
T.getInfo(); Test& T2 = func2(); //若是这里T2是一个引用,则不是直接拷贝赋值,
//而是对匿名对象2的内存空间的一个别名,
//而这个对象已经被释放了,故结果是随机值

T2.getInfo(); system("pause");
}

C++回顾day02---<引用>---待补充的更多相关文章

  1. PHP 引用是个坑,请慎用

    去年我参加了很多次会议,其中八次会议里我进行了相关发言,这其中我多次谈到了 PHP 的引用问题,因为很多人对它的理解有所偏差.在深入讨论这个问题之前,我们先回顾一下引用的基本概念,明确什么是" ...

  2. Java中到底是值传递还是引用传递?

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

  3. JAVA8学习——深入浅出方法引用(学习过程)

    方法引用:method reference 先简单的看一下哪里用到了方法引用: public class MethodReferenceTest { public static void main(S ...

  4. 使用java操作MongoDB

    1.环境准备 下载mongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.查询集合中所有 ...

  5. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  6. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

  7. 《LOST》 电视

    还没看正剧,所以转来帮助看电视 从起源到终点:<LOST>剧情全解析(一)   此文是LOST完结之后的剧情解析,剧透,慎入   从起源到终点:<LOST>剧情全解析(一) 转 ...

  8. Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...

  9. C++STL(vector,map,set,list,bitset,deque)成员函数整理

    补充: vector 删除指定元素: vec.erase(remove(vec.begin(), vec.end(), val),           vec.end());remove()返回的是删 ...

  10. Java编程思想总结笔记Chapter 5

    初始化和清理是涉及安全的两个问题.本章简单的介绍“垃圾回收器”及初始化知识. 第五章  初始化与清理 目录:5.1 用构造器确保初始化5.2 方法重载5.3 默认构造器5.4 this关键字5.5 清 ...

随机推荐

  1. P1308 统计单词数

    P1308 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请 ...

  2. Longest Ordered Subsequence POJ - 2533 最长上升子序列dp

    题意:最长上升子序列nlogn写法 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  3. 贝叶斯定理推导(Bayes' Theorem Induction)

    这里用Venn diagram来不严谨地推导一下贝叶斯定理. 假设A和B为两个不相互独立的事件. 交集(intersection):  上图红色部分即为事件A和事件B的交集. 并集(union):  ...

  4. scrapy 发送post请求

    登录人人网为例 1.想要发送post请求,那么使用'scrapy.FormRequest'方法,可以方便的指定表单数据 2.如果想在爬虫一开始的时候就发送post请求,那么应该重写'start_req ...

  5. 使用树莓派 Raspberry Pi 播放豆瓣 FM

    安装 mplayersudo apt-get install mplayer 安装 Python-pipsudo apt-get install python-pip 通过 python-pip 安装 ...

  6. RequestContextHolder 很方便的获取 request

    在 Spring boot web 中我们可以通过 RequestContextHolder 很方便的获取 request. ServletRequestAttributes requestAttri ...

  7. 【APIO2018】铁人两项(圆方树,动态规划)

    [APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...

  8. Gym - 100989F

    You must have heard about Agent Mahone! Dr. Ibrahim hired him to catch the cheaters in the Algorithm ...

  9. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  10. 最全面的 Spring 学习笔记

    http://www.codeceo.com/article/learn-spring.html 来源:泊浮目 分享到:更多36 Spring致力于提供一种方法管理你的业务对象.在大量Java EE的 ...