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

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

和指针类似(其实引用本质就是使用了一个常指针 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. BZOJ3239Discrete Logging——BSGS

    题目大意:给出$P,B,N$,求最小的正整数$L$,使$B^L\equiv N(mod\ P)$. $BSGS$模板题. #include<set> #include<map> ...

  2. JS的初步了解

    JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备.JavaScript 是脚本语言 HTML 中的 ...

  3. Codeforces1023E Down or Right 【贪心】

    题目分析: 从起点开始询问终点连通性,优先右走.从终点开始询问起点连通性,优先上走. 代码: #include<bits/stdc++.h> using namespace std; in ...

  4. 学习Android过程中遇到的问题及解决方法——网络请求

    在学习Android的网络连接时遇到崩溃或异常(出现的问题就这两个,但是不稳定)的问题,先上代码,看看哪里错了(答案在文末) activity_main.xml: <?xml version=& ...

  5. springMVC整理03--处理数据模型 & 试图解析器 & @ResponseBody & HttpEntity

    1.处理模型数据 SpringMVC 中的模型数据是非常重要的,因为 MVC 中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据.当有一个查询的请求,控制器(C ...

  6. Spring03-AOP

    一. AOP介绍 1. Aop介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编 ...

  7. VC++2010组件安装失败解决办法

    安装SQLSERVER时,安装不上,总是报错说 VC++2010组件安装错误. 单独安装时,也会报出严重错误无法安装.就是下面这两个 最后到网上找到一个办法解决了:如下: 下载这个软件 Microso ...

  8. 【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)

    学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新. 区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想: 就是在数据结构中,树形结构可以线性存储(线性表 ...

  9. SElinux解决web网站无法访问

    SElinux解决web网站无法访问工具/原料centos 6.5系统httpd web服务器 SELinux 设置为enforcing:强制模式,代表 SELinux 运作中 方法/步骤1. 1se ...

  10. 洛谷P3168 任务查询系统

    题意:有n个任务,第i个的存在时间是li~ri,有个权值.求t时刻第k大的权值. 这毒瘤...本来是前缀和 -> 主席树,我是树套树...然后光荣TLE. 其实很裸.一开始我写的是每个位置维护一 ...