C++引用

一、普通引用

【变量名】

变量名实质上是一段连续存储空间的别名,是一个标号

程序中通过变量来申请并命名内存空间

通过变量的名字可以使用存储空间

问题1:对一段连续的内存空间只能取一个别名吗?【不是】

1、引用是C++的概念

// 问题:C中可以编译通过吗?

int main(void)
{int a = 0;int &b= a; //int * const b = &ab=11;//*b = 11;return 0;
}

//  gcc编译结果

// 错误: expected identifier or ‘(’ before ‘&’token

//‘b’未声明(在此函数内第一次使用)

// 结论:请不要用C的语法考虑 b=11

2、引用概念

(1)在C++中新增加了引用的概念

(2)引用可以看作一个已定义变量的别名

(3)引用的语法:Type& name = var;

(4)引用做函数参数?(引用作为函数参数声明时不进行初始化)

int main(void)
{int a = 1;int &b = a;//b是a的别名,请问c++编译器后面做了什么工作?b = 5;cout<< "b--->"<< a << endl; return 0;
}

【普通引用在声明时必须用其它的变量进行初始化】

3、引用的意义

(1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针

(2)引用相对于指针来说具有更好的可读性和实用性

void swap(int &a, int &b)
{int t = a;a = b;b = t;
}void swap(int*a, int *b)
{int t = *a;*a = *b;*b = t;
}

4、普通引用有自己的空间吗?

#include <stdio.h>struct stu
{int &a;int &b;
};int main(void)
{printf("sizeof(stu) =%d\n", sizeof(stu));return 0;
} // 8

【引用是一个有地址,引用是常量(char *const p)】

5、引用的本质

(1)引用在C++中的内部实现是一个常指针

Type&name çèType*const name

(2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

(3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏


6、引用注意点

(1)当函数返回值为引用时

若返回栈变量

不能成为其它引用的初始值

不能作为左值使用

(2)若返回静态变量或全局变量

可以成为其他引用的初始值

即可作为右值使用,也可作为左值使用

【当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)】

二、常引用

1、const引用(使用变量初始化)

【const在C中是只读变量,在C++中是常量】

const Type& name = var;【const引用让变量拥有只读属性】

#include <iostream>
using namespace std;int main(void)
{int a = 2;const int &b = a;b= 3;cout<< a << b << &a << &b << endl;return 0;
}

// 错误:向只读形参‘b’赋值

2、const引用(使用字符常量初始化)

(1)用变量对const引用初始化,const引用分配内存空间了吗?

(2)用常量对const引用初始化,const引用分配内存空间了吗?

#include <iostream>
using namespace std;int main(void)
{const int &a = 10;int *p = (int *)&a;*p = 12;cout << a<< endl;return 0;
}

//当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将//引用名作为这段空间的别名

//使用常量对const引用初始化后将生成一个只读变量

const&相当于const int  *const a;

普通引用相当于int *const a;


三、引用与指针有什么区别

(1) 引用必须被初始化,指针不必。

(2) 引用初始化以后不能被改变,指针可以改变所指的对象。

(3) 不存在指向空值的引用,但是存在指向空值的指针。

C++ —— C++引用相关推荐

  1. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  2. [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解

    模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...

  3. java 无法取消引用_Java的新手,并出现错误“无法取消引用int” - java

    我是java的新手,并且已经从事了一段时间,但是仍然收到错误消息:无法取消引用int.我看到了几个类似的问题,但仍然无法弄清自己的情况. 这是完整的代码: package inclass; class ...

  4. C++ 对象的声明与引用

    C++ 对象的声明的格式: 类名 对象名 (多个对象名之间用逗号隔开) 声明1个对象: People student; 声明多个对象 People student,student1,student2; ...

  5. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  6. Android 打包 aar文件的流程以及aar的引用

    打包aar 分为原项目打包成aar 和新建module 打包成aar 1 原项目打包成aar 文件 需要把项目先变成库 把apply plugin: 'com.android.application' ...

  7. 父类引用指向子类对象

    父类引用指向子类对象,如何访问子类的属性? 1.第一种办法最简单,强制类型转化为子类. 2.父类引用指向子类对象,由于当前引用为父类,只能访问父类的字段和方法,但是根据多态性可以访问子类的方法,在这个 ...

  8. postgreSQL外键引用查询 查询外键被那些表占用

    根据一个表名,查询所有外键引用它的表,以及那些外键的列名 key_column_usage(系统列信息表), pg_constraint(系统所有约束表) SELECT x.table_name,x. ...

  9. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  10. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

最新文章

  1. 51单片机怎么编程,有什么好的课程?
  2. python比c语言好学吗-对于初学者而言,python和 c语言先学哪个好
  3. 带你一文搞懂网络层的IP协议\数据链路层的以太网\ARP协议以及DNS和NAT协议
  4. “假冒上市”公司再甩锅:我被服务商给骗了
  5. 2019百度之星程序设计大赛 1005 Seq
  6. 基于zookeeper实现分布式读写锁
  7. linux 下sqlplus里无法使用方向键的解决
  8. Ueditor 使用
  9. fastjason 0day 漏洞修复
  10. matlab——取整函数
  11. VBA金额转换中文大写(原创新解版)
  12. Spring Boot2 系列教程(三十三)整合 Spring Security
  13. Exception 异常和自定义异常
  14. 《企业大数据系统构建实战:技术、架构、实施与应用》——2.2 大数据职位构建体系...
  15. qq聊天纪录被删除应该如何恢复
  16. 广州特耐苏-广州风淋通道构造及特点
  17. 职场减压移魂大法几则 (转东转西)
  18. 火焰图(FlameGraph)的使用
  19. c语言 自锁按键,具有自锁功能的按键结构的制作方法
  20. 理解梅尔频谱(mel spectrogram)

热门文章

  1. android gravity参数,Gravity - [ Android中文手册 ] - 在线原生手册 - php中文网
  2. 计算机风险评估管理程序,第5章 信息安全风险评估实施流程
  3. python中other_Python other
  4. Flask 第三方组件之 SQLAlchemy
  5. Python 内置模块之 时间模块 datetime
  6. cf方框透视易语言代码怎么写_易语言真的那么不入流吗?
  7. jQuery中的元素操作
  8. git 忽略 部分文件夹_git提交忽略某些文件或文件夹
  9. ecshop pages.lbi.php,关于Ecshop pages.lbi.php Xss漏洞的修复
  10. C++起航篇——bool类型,输入输出,命名空间