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

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

和指针类似(其实引用本质就是使用了一个常指针 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. 自定义Wed框架

    Wed框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义wed框架 impor ...

  2. Elasticsearch 聚合统计与SQL聚合统计语法对比(一)

    Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据 ...

  3. Girls and Boys HDU - 1068 二分图匹配(匈牙利)+最大独立集证明

    最大独立集证明参考:https://blog.csdn.net/qq_34564984/article/details/52778763 最大独立集证明: 上图,我们用两个红色的点覆盖了所有边.我们证 ...

  4. 【XSY1591】卡片游戏 DP

    题目描述 有标有数字为\(1\)~\(9\)的卡片各\(a_1,a_2\cdots a_9\)张,还有标有乘号的卡片\(m\)张.从中取出\(n\)张按任意顺序排列,取出两个乘号相邻和乘法在边界上的非 ...

  5. maven手动安装jar包到本地仓库,以ojdbc6为例

    在做mybatis generator的中文注释实现时,感觉每次都要在配置文件中指定ojdbc6的位置太麻烦了,别人用也不方便,没有的还得自己去下,所以就想直接把ojdbc6打包到项目里,这样拿到就可 ...

  6. 【BZOJ5315】[JSOI2018]防御网络(动态规划,仙人掌)

    [BZOJ5315][JSOI2018]防御网络(动态规划,仙人掌) 题面 BZOJ 洛谷 题解 显然图是仙人掌. 题目给了斯坦纳树就肯定不是斯坦纳树了,,,, 总不可能真让你\(2^n\)枚举点集再 ...

  7. 【转】void 详解

    void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...

  8. 工作机制.py

    rpc_server.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai'"&quo ...

  9. Centos7之Gcc安装

    1下载Gcc包进行安装https://gcc.gnu.org 下载下来的是一个包文件,但是要进行一系列的编译安装,听麻烦的. 不如直接使用这个yum来从网络上进行安装. 2 yumyum instal ...

  10. [ZJOI2010]贪吃的老鼠(网络流+建图)

    题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉.第j只老鼠吃 ...