C++之引用

普通引用和常引用

1. 变量名的回顾
变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)
程序中通过变量来申请并命名内存空间
通过变量的名字可以使用存储空间
问题:一段连续的内存空间是否只能有一个别名吗?

2. C++引用的概念
引用可以看作一个已定义变量的别名
引用的语法:Type& name = var;
注:普通引用在声明时必须用其它的变量进行初始化

3. 引用意义
1)引用作为其它变量的别名而存在,因此在 一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性

4. 引用的本质
引用在C++中的内部实现是一个常指针
Type& name çè Type* const name

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

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

当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的

#include <stdio.h>
#include <stdlib.h>int main5_1()
{// 定义变量 a,a 是一个整形变量,占4个字节// a 变量代表这4个字节的内存,a就是这块内存的名字int a = 10;// 定义一个引用变量,b 是 a 的引用// a 是一块4字节内存的名字,引用的意思是给这块内存重新取个名字// b a代表的那块内存的别名,b 和 a 代表同一块内存// 引用的语法: 在定义变量的时候在变量前加 &int &b = a;int c = 40;// 这是复制操作,将c的之赋给b// 普通引用在定义必须要初始化,引用是一块空间的别名,// 如果空间不存在,引用就没有意义b = c;b = 90;printf ("a = %d, b = %d, c = %d\n", a, ,b, c);return 0;
}void swap5_1(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void swap5_3(int &a, int &b)
{int tmp = a;a = b;b = tmp;
}int main5_2()
{int a = 10;int b = 20;swap (a, b);// swap (&a, &b);printf ("a = %d, b = %d\n", a, b);return 0;
}struct A
{int id;char name[20];
};void init (A** p)
{*p = (A*)malloc(sizeof(A)/sizeof(char));
}// 指针引用
void init1 (A* &p)
{p = (A*)malloc(sizeof(A)/sizeof(char));p->id = 20;
}int main5_3()
{A* pa = NULL;// init (&pa);init1 (pa);printf ("id = %d\n", pa->id);return 0;
}void func (A* pa)
{printf ("id = %d, name = %s\n", pa->id, pa->name);
}void func5_1 (A &a)
{// 引用是空间的别名,操作结构体的时候用printf ("id = %d, name = %s\n", a.id, a.name);
}int main5_4()
{A a = {10, "wang"};// func (&a);func5_1 (a);return 0;
}struct B
{double &a;double &b;
};int main5_5()
{double a = 10;double &b = a;printf ("size = %d\n", sizeof(b));// 引用本质是指针,常指针printf ("B = %d\n", sizeof(B));return 0;
}#include <stdio.h>void swap5_6(int &a, int &b)
{int temp = a;a = b;b = temp;
}
// ====>
#if 0
int swap5_6(int * const a, int * const b)
{int temp = *a;*a = *b;*b = temp;
}
#endif int main5_6()
{int a = 0;int &b = a;   // 常指针:====>  int * const b = &a;b = 90;       // *b = 90;printf ("&a = %p, &b = %p\n", &a, &b); // &b ==> &(*b)printf ("a = %d, b = %d\n", a, b);return 0;
}// 函数返回值是引用,不能返回栈上的引用,可以返回静态变量和全局变量的引用
int &func5_6()
{static int a;a++;printf ("a = %d\n", a);return a; 
}int main5_7()
{for (int i = 0; i < 10; i++){func5_6();}// 1、函数返回值是引用,如果用引用去接,接回来的是一个 引用int &b = func5_6();b = 100;func5_6();// 2、函数返回值是引用,可以用普通变量去接,接回来的是一个 值int c = func5_6();printf ("c = %d\n", c);c = 200;func5_6();// 3、函数返回值是引用,可以作为左值来使用func5_6() = 200;printf ("b = %d\n", b);func5_6();return 0;
}int add(int &a, int &b)
{return a + b;
}int main6_1()
{int a = 10;int b = 20;printf ("a + b = %d\n", add(a, b));//  printf ("a + b = %d\n", add(10, b));//  int &c = 10;  // int * const c = &10;return 0;
}int add2(const int &a, const int &b)
{return a + b;
}int main6_3()
{printf ("a + b = %d\n", add2(10,20));return 0;
}int main6_2()
{// 常量 放在常量表中const int a = 10;int c = 10;// 普通引用int &b = c;// 常引用,意思不能通过引用改变被引用的值const int &d = c;  // const int * const d = &c;// 常引用的初始化有2中方式// 1、引用普通变量,不能改变变量的值{int a1 = 100;const int &ra = a1;}// 2、使用常量去初始化常引用{// 当使用常量对常引用进行初始化的时候,编译器会为这个常量分配一块空间// 将这个常量的值复制到这个空间里// 然后让这个常引用作为这个空间的别名const int &ra = 10;  // const int * const ra = &10;// ra = 90;int *p = (int *)&ra;*p = 200;printf ("ra = %d\n", ra);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 极简小例:数值计算、千米换算为米、九九乘法表、循环

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 代码&#xff1a; <template><div id"app"><!-- 千米和米换算 --><div id "computed_props&quo…

shiro框架的学习

权限控制是shiro最核心的东西 Shiro权限声明通常是使用以冒号分隔的表达式。一个权限表达式可以清晰的指定资源类型&#xff0c;允许的操作&#xff0c;可访问的数据。同时&#xff0c;Shiro权限表达式支持简单的通配符&#xff0c;可以更加灵活的进行权限设置。 下面以实例来说…

C++之内联函数

内联函数是一种特殊的函数&#xff0c;具有普通函数的特征&#xff08;参数检查&#xff0c;返回类型等&#xff09; 内联函数是对编译器的一种请求&#xff0c;因此编译器可能拒绝这种请求 内联函数由 编译器处理&#xff0c;直接将编译后的函数体插入调用的地方 宏代码片段…

妈妈培养天才的13绝招

作父母的&#xff0c;都希望自己的宝宝可以变得聪明、懂事&#xff0c;所以想尽办法去让宝宝上早教班、做早期智力开发……当然&#xff0c;这些做法对于开发宝宝智力能够起到一定的帮助。但是&#xff0c;千万别忽视您所能给予宝宝的家庭教育。    近日&#xff0c;日本一位…

Vue.js 极简小例: 4 种方式样式绑定、style 的多种方式实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 代码&#xff1a; <template><div id"app"><!-- JSON方式使用样式 --><div v-bind:style"{ colo…

C++之默认参数

一、什么是默认参数 C中可以在函数声明时为参数提供一个默认值&#xff0c; 当函数调用时没有指定这个参数的值&#xff0c;编译器会自动用默认值代替 二、默认参数规则 只有参数列表后面部分的参数才可以提供默认参数值 一旦在一个函数调用中开始使用默认参数值&#xff…

50 Python - 装饰器 类定义装饰器

04 类定义装饰器 上节通过函数定义装饰器&#xff0c;本节通过类定义装饰器 001 定义类装饰器 定义一个类&#xff0c;类里面两个函数&#xff0c;一个构造函数init()&#xff0c;一个调用函数call() 构造函数init时候&#xff0c;传递一个函数func()进来 调用函数call()&#…

C++之过载函数

过载函数的定义&#xff1a; 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 过载函数的判断标准&#xff1a; 函数重载至少满足下面的一个条件&#xff1a; 参数个数不同 参数类型不同 参数顺序不同 函数返回值不是函数重载的判断标准 调用…

人民币贬值会让八类人损失惨重!有你吗?

截至20日&#xff0c;人民币本周对美元累计贬值1.24%&#xff0c;年初以来不到三个月时间累计贬值2.79%。分析人士表示&#xff0c;人民币短期内仍有较强下跌压力。本轮人民币急贬预计将对几类人群收入造成严重冲击。 本周以来&#xff0c;人民币对美元即期汇价持续单边下跌。数…

Vue.js 极简小例: 点击事件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 代码&#xff1a; <template><div> <!-- jy_mothed 是在 js 中自定义的方法 --><button v-on:click"jy_mot…

从最大似然估计到最小二乘法

这一部分内容和吴恩达老师的CS229前面的部分基本一致&#xff0c;不过那是很久之前看的了&#xff0c;我尽可能写的像吴恩达老师那样思路缜密。 1.假设 之前我们了解过最大似然估计就是最大化似然函数$$L(\theta) \sum log(p(x_{i}|\theta))$$ 来确定参数\(\theta\)&#xff0…

C++之类

A&#xff09;封装&#xff0c;是面向对象程序设计最基本的特性。把数据&#xff08;属性&#xff09;和函数&#xff08;操作&#xff09;合成一个整体&#xff0c;这在计算机世界中是用类与对象实现的。 B&#xff09;封装&#xff0c;把客观事物封装成抽象的类&#xff0c;…

APU(美国AMD公司研发的加速处理器)

APU(Accelerated Processing Unit)中文名字叫加速处理器&#xff0c;是AMD“融聚未来”理念的产品&#xff0c;它第一次将中央处理器和独显核心做在一个晶片上&#xff0c;它同时具有高性能处理器和最新独立显卡的处理性能&#xff0c;支持DX11游戏和最新应用的“加速运算”&am…

根本不值得一提的乒乓球国手王浩

最近在看世界乒乓球锦标赛&#xff0c;关于王浩&#xff0c;很多人都说他的技术开创了一个时代&#xff0c;而事实是王浩没有夺过任何世界性大的赛事的单打冠军&#xff0c;我所说的世界性的赛事包括&#xff1a;世界乒乓球锦标赛,奥运会&#xff0c;世界杯&#xff0c;国际乒联…

Vue.js 极简小例:表单 (输入框 input、文本域 textarea、单选框 radio、下拉菜单 selected、复选框 checkbox)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 代码&#xff1a; <template> <div > <p>---------------------------------------------------------------------…

C++之构造函数和析构函数

一、构造函数 1. 构造函数的定义&#xff1a; 1&#xff09;C中的类可以定义与类名相同的特殊成员函数&#xff0c;这种与类名相同的成员函数叫做构造函数&#xff1b; 2&#xff09;构造函数在定义时可以有参数&#xff1b; 3&#xff09;没有任何返回类型的声明。 2. 构…

显卡常识 电脑显卡基础知识普及

我们组装电脑的时候肯定需要考虑到显卡性能&#xff0c;如果电脑配置中的显卡性能不行&#xff0c;那么电脑肯定玩不了大型游戏。可能一些新电脑用户对显卡一点也不了解&#xff0c;我们下面来详细介绍一下电脑显卡的基础知识。 一、显卡简介 显卡是个人电脑最基本组成部分之一…

操纵浏览器历史记录 : popstate() 、 history.pushState() 、 window.history.pushState()

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、历史记录前进与后退 1.后退&#xff1a; window.history.back() -- 相当于用户在浏览器的工具栏上点击返回按钮&#xff1b; 2.前…

C++之拷贝函数

拷贝构造函数是一种特殊的构造函数&#xff0c;函数的名称必须和类名称一致&#xff0c;它的唯一的一个参数是本类型的一个引用变量&#xff0c;该参数是const类型&#xff0c;不可变的。例如&#xff1a;类X的拷贝构造函数的形式为X(X& x)。 以下情况都会调用拷贝构造函数…