当前位置: 首页 > news >正文

C++回顾(二)——const和引用

2.1 C++中的const

2.1.1 C与C++中const的比较

  • (1)C语言中的const
    C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间。

  • (2)C++中的const
    1、C++中 const 变量声明的是一个真正的常量,不是变量,所以编译器不会为该常量分配空间
    2、const 修饰的常量会被放到“符号表” 中;
    3、对const常量取地址,这一步操作会让编译器为该变量分配空间,分配的空间并不会被a使用;
    4、通过指针改变指向的空间的值,这个空间是编译器为常量分配的空间,但是常量的值并不在这个空间内 所以即使通过指针修改了这个空间的值,也不会影响到 a 本身。

  • (3)C++编译器对const常量的处理
    当碰见常量声明时,在符号表中放入常量 ==> 问题:那又如何解释取地址?
    编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C),但是编译过程中若发现使用常量则直接以符号表中的值替换,即使给该常量分配了空间,也并不使用里面的值。
    在这里插入图片描述

2.1.2 const与#define

  • 相同之处
    C++中的const修饰的和#define定义的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了

  • 不同之处
    (1)const常量是由编译器处理的,提供类型检查和作用域检查
    (2)宏定义由预处理器处理,单纯的文本替换

#include <iostream>using namespace std;void f()
{#define b 100const int c = 200;
}int main()
{const int a = 1;     //C++中,const修饰的是常量,存放在符号表中//a++;int *p = (int *)&a;  //对const修饰的常量取地址,编译器分配了一个整形的长度,并且把数字1填写到对应的内存*p = 2;cout << a << endl;  //因为a是常量,所以用1替换acout << b << endl;   //作用域不同//cout << c << endl; // 会报错return 0;
}

2.2 C++中的引用

2.2.1 普通引用

(1)变量名回顾

  • 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)
  • 程序中通过变量来申请并命名内存空间,通过变量的名字可以使用存储空间

(2) C++引用概念

  • 引用可以看作一个已定义变量的别名
  • 引用的语法:Type& name = var;
  • 引用在定义的时候必须初始化。
#include <iostream>int main()
{// 定义一个int型变量a,在内存中占4个字节,// 变量名 a 就代表了这一块内存,或者说 a 是这块内存的别名int a = 10; // 定义了一个引用变量 b ,它是 a 的别名,和 a 代表同一块内存空间// 对 b 的操作 和 对 a 的操作是一样的int& b = a;// 改变 b 等于改变了 ab = 20; std::cout << " a = " << a << " b = " << b << std::endl;// a 与 b 代表同一块内存空间std::cout << &a << " " << &b << std::endl;return 0;
}

在这里插入图片描述

(3) 引用的意义

  • 1、引用作为其它变量的别名而存在,因此在一些场合可以代替指针
  • 2、引用相对于指针来说具有更好的可读性和实用性。
#include <iostream>using namespace std;void swap(int &x, int &y)   //int &x = m;
{y = x + y;x = y - x;y = y - x;
}int main()
{int a = 100;int &b = a;     //定义引用b,初始化为a   b是a的别名b = 200;        //a = 200cout << a << endl;int m = 1, n = 2;swap(m, n);cout << "m = " << m << " n = " << n << endl;return 0;
}

在这里插入图片描述

(4)引用的本质

  • 1. 引用类型是否占内存空间?
    
struct Student
{char &a;char &b;
};
sizeof(struct Student) ====》 应该是输出 16 个字节(当作指针)
#include <iostream>using namespace std;struct Test
{int &a;int &b;char &c;      //引用的本质是常指针
};int main()
{int a = 1;char ch = 'x';int &pa = a;     //引用定义的时候必须要初始化char &pc = ch;   //等价于 char *const pc = &ch;//int &f;cout << sizeof(pa) << endl;   //引用的长度就是其引用的对象的长度cout << sizeof(pc) << endl;//分析正常语法现象的时候,当做别名来分析,//但是分析奇怪的语法现象,需要考虑引用的实现cout << sizeof(struct Test) << endl;   return 0;
}

在这里插入图片描述

  •  2. 引用的本质
    
  • 引用在C++中的内部实现是一个常指针
    Type& name <====> Type* const name

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

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

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

(5)函数返回值为引用

  • 返回栈变量(不要返回局部变量的引用)
  • 返回全局变量或静态变量
#include <iostream>using namespace std;int g = 100;int &f1()
{int a = 1;//return a;    //不要返回局部变量的引用return g;
}int f2()
{return g;
}int main()
{int &b = f1();f1() = 1;//f2() = 1;   //等价于100 = 1;return 0;
}

(6)指针引用

#include <iostream>
#include <cstdlib>
#include <cstring>using namespace std;void Init(char *&s)  //引用指针
{s = (char *)malloc(sizeof(char) * 100);
}int main()
{char *s = NULL;Init(s);strcpy(s, "hello");cout << s << endl;return 0;
}

在这里插入图片描述

2.2.2 常引用

  • const & int e 相当于 const int * const e
  • 普通引用 相当于 int *const e1
  • 当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
  • 使用字面量对const引用初始化后,将生成一个只读变量
#include <iostream>int main()
{int a = 10; int &b = a;       // 普通引用int x = 20; const int& y = x;   // 常引用  让变量y拥有只读属性,不能通过y改变x的值// 常引用 初始化 分为 2中情况// 1、用变量初始化 常引用{   int a1 = 20; const int& b1 = a1; // a1 变量去初始化常引用}   // 2、用常量去初始化常引用{   const int a  = 40; // C++编译器把a放在符号表中// int& b = 41;    // 普通引用,引用一个常量,常量是没有地址空间的,这样的做法是不合法的// 使用常量去初始化常引用是合法的,C++编译器会为该引用分配空间,常量的值存储到分配的空间中去// 使用常量对 const引用 初始化后,将生成一个只读变量const int& b = 42; int *p = (int *)&b;*p = 50; std::cout << "b = " << b << std::endl;}return 0;
}

在这里插入图片描述

相关文章:

C++回顾(二)——const和引用

2.1 C中的const 2.1.1 C与C中const的比较 &#xff08;1&#xff09;C语言中的const C语言中 const修饰的变量是一个 常变量&#xff0c;本质还是变量&#xff0c;有自己的地址空间。 &#xff08;2&#xff09;C中的const 1、C中 const 变量声明的是一个真正的常量&#xff…...

MXNet中使用双向循环神经网络BiRNN对文本进行情感分类<改进版>

在上一节的情感分类当中&#xff0c;有些评论是负面的&#xff0c;但预测的结果是正面的&#xff0c;比如&#xff0c;"this movie was shit"这部电影是狗屎&#xff0c;很明显就是对这部电影极不友好的评价&#xff0c;属于负类评价&#xff0c;给出的却是positive。…...

DNS 域名解析

介绍域名 网域名称&#xff08;英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain&#xff09;&#xff0c;简称域名、网域。 域名是互联网上某一台计算机或计算机组的名称。 域名可以说是一个 IP 地址的代称&#xff0c;目的是为了便于记忆。例如&#xff0c…...

Spring MVC 源码- ViewResolver 组件

ViewResolver 组件ViewResolver 组件&#xff0c;视图解析器&#xff0c;根据视图名和国际化&#xff0c;获得最终的视图 View 对象回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 ViewResolver 组件&#xff0c;可以回到《一个请求响应的旅行过程》中的 …...

【Hello Linux】初识冯诺伊曼体系

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍冯诺伊曼体系 冯诺伊曼体系 冯诺伊曼体系结构的合理性 我们在Linux的第一篇博客中讲解了第一台计算机的发明是为了解决导弹的…...

mysql索引,主从多个核心主题去探索问题。

网上收集不错的优化方案 事务 mvcc 详讲 详讲 索引 索引概念 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据 库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据…...

前端一面必会面试题(边面边更)

哪些情况会导致内存泄漏 以下四种情况会造成内存的泄漏&#xff1a; 意外的全局变量&#xff1a; 由于使用未声明的变量&#xff0c;而意外的创建了一个全局变量&#xff0c;而使这个变量一直留在内存中无法被回收。被遗忘的计时器或回调函数&#xff1a; 设置了 setInterval…...

【Hello Linux】初识操作系统

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍下操作系统的概念 操作系统 操作系统是什么&#xff1f; 操作系统是管理软硬件资源的软件 为什么要设计操作系统 为什么要设…...

完美的vue3动态渲染菜单路由全程

前言&#xff1a; 首先&#xff0c;我们需要知道&#xff0c;动态路由菜单并非一开始就写好的&#xff0c;而是用户登录之后获取的路由菜单再进行渲染&#xff0c;从而可以起到资源节约何最大程度的保护系统的安全性。 需要配合后端&#xff0c;如果后端的值不匹配&#xff0…...

2023年CDGA考试模拟题库(301-400)

2023年CDGA考试模拟题库(301-400) 300.无附加价值的信息通常也不会被删除,因为:[1分] A.它不应该被移除,所有数据都是有价值的 B.我们可能在以后的某个阶段需更这些信息 C.规程中不明确是否应该保留 D.数据是一种资产它很可能在未来被认为是有价值的 E.规程中不明确哪些是…...

Linux-常见命令

&#x1f69c;关注博主&#xff1a;翻斗花园代码手牛爷爷 &#x1f699;Gitee仓库&#xff1a;牛爷爷爱写代码 目录&#x1f692;xshell热键&#x1f697;Linux基本命令&#x1f697;ls指令&#x1f695;pwd指令&#x1f696;cd指令&#x1f68c;touch指令&#x1f68d;mkdir指…...

2.25测试对象分类

一.按照测试对象划分1.界面测试又称UI测试,按照界面的需求(一般是ui设计稿)和界面的设计规则,对我们软件界面所展示的全部内容进行测试和检查.对于非软件来说:颜色,大小,材质,整体是否美观对于软件来说:输入框,按钮,文字,图片...的尺寸,颜色,形状,整体适配,清晰度等等,2.可靠性…...

【Zabbix实战之部署篇】Zabbix客户端的安装部署方法

【Zabbix实战之部署篇】Zabbix客户端的安装部署方法 一、Zabbix-agent2介绍1.Zabbix-agent2简介2.Zabbix-agent2优点3.主动模式和被动模式二、环境规划1.Zabbix服务器部署链接2.IP规划三、配置客户端系统环境1.关闭selinux2.放行端口或关闭防火墙四、安装zabbix-agent21.下载za…...

【CSS】CSS 层叠样式表 ② ( CSS 引入方式 - 内嵌样式 )

文章目录一、CSS 引入方式 - 内嵌样式1、内嵌样式语法2、内嵌样式示例3、内嵌样式完整代码示例4、内嵌样式运行效果一、CSS 引入方式 - 内嵌样式 1、内嵌样式语法 CSS 内嵌样式 , 一般将 CSS 样式写在 HTML 的 head 标签中 ; CSS 内嵌样式 语法如下 : <head><style …...

MySQL事务与索引

MySQL事务与索引 一、事务 1、事务简介 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性&#xff0c;保证成批的 SQL 语句要么全部执行&#xff0c;要么全部不执行。事务用来管理 insert,update,delete 语句 事务特性…...

【编程入门】应用市场(php版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…...

文化:你所在的团队,有多少人敢讲真话?

你好&#xff0c;我是叶芊。 今天我们要讨论的话题是文化&#xff0c;说“文化”这个词你可能会觉得很虚&#xff0c;那我们换个词——“做事风格”&#xff0c;这就和你们团队平时的协作习惯密切相关了。 做事风格&#xff0c;往小了讲&#xff0c;会影响团队成员对开会的认知…...

Linux | 项目自动化构建工具 - make/Makefile

make / Makefile一、前言二、make/Makefile背景介绍1、Makefile是干什么的&#xff1f;2、make又是什么&#xff1f;三、demo实现【见见猪跑&#x1f416;】三、依赖关系与依赖方法1、概念理清2、感性理解【父与子】3、深层理解【程序的翻译环境 栈的原理】四、多学一招&#…...

Spring源码该如何阅读?十年架构师带来的Spring源码解析千万不要错过!

写在前面最近学习了一句话&#xff0c;感觉自己的世界瞬间明朗&#xff0c;不再那么紧张焦虑恐慌&#xff0c;同样推荐给大家&#xff0c;希望我们都终有所得。“如果一个人不是发自内心地想要做一件事情&#xff0c;那么&#xff0c;他是无法改变自己的人生的。” 同样这句话用…...

sonarqube 外部扫描器 go vet golangci-lint 无法导入问题

首先&#xff0c;请看[外部分析报告]各种语言的报告生成 go vet 2> govet-report.out#没有golangci-lint&#xff0c;我从网上找到了 golangci-lint run --out-format checkstyle ./... > golangci-lint-report.xml值得注意的是&#xff0c;貌似不支持目录&#xff0c;仅…...

Tesseract-OCR 控制台怎么使用

Tesseract-OCR 控制台是一个命令行工具&#xff0c;可以在 Windows、Linux、macOS 等操作系统中使用。下面是使用 Tesseract-OCR 控制台进行文字识别的基本步骤&#xff1a;安装 Tesseract-OCR&#xff1a;可以到 Tesseract-OCR 的官方网站&#xff08;https://github.com/tess…...

九龙证券|美股创年内最大周跌幅!美联储官员密集发声!波音重挫近5%

当地时刻2月24日&#xff0c;美股三大指数收盘明显跌落。道指跌1.02%&#xff0c;标普500指数跌1.05%&#xff0c;纳指跌1.69%。 大型科技股普跌&#xff0c;微软、亚马逊跌超2%。波音大跌4.8%&#xff0c;居道指跌幅榜首位&#xff0c;公司因机身部件有问题再次暂停向用户交付…...

C++014-C++字符串

文章目录C014-C字符串字符串目标char[]和stringchar[]char*string字符常量与字符串常量字符串的输入题目描述 字符串输出题目描述在线练习&#xff1a;总结C014-C字符串 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 字符串 目标 1、了解字符串…...

Android 架构 MVC MVP MVVM,这一波你应该了然于心

MVC&#xff0c;MVP和MVVM是软件比较常用的三种软件架构&#xff0c;这三种架构的目的都是分离&#xff0c;避免将过多的逻辑全部堆积在一个类中。在Android中&#xff0c;Activity中既有UI的相关处理逻辑&#xff0c;又有数据获取逻辑&#xff0c;从而导致Activity逻辑复杂不单…...

物联网在医疗保健领域的5大创新应用

如今&#xff0c;物联网的发展越来越迅速&#xff0c;我们无法低估物联网在当今世界的重要性。大多数人每天都会使用到物联网设备。例如&#xff0c;当你使用智能手表来跟踪你的锻炼时&#xff0c;你就间接地使用了物联网的功能。由于物联网为世界带来了很多有效的帮助&#xf…...

【一天一门编程语言】Haskell 语言程序设计极简教程

Haskell 语言程序设计极简教程 一、什么是 Haskell Haskell 是一种纯函数式编程语言&#xff0c;它把程序设计抽象化到一个更高的层次&#xff0c;简化程序开发工作量&#xff0c;能够更快更容易地完成任务。 它是一种函数式编程语言&#xff0c;它采用函数式编程方法&#…...

getStaticPaths函数 以及 fallback参数

getStaticPaths是Next.js的一个静态生成API&#xff0c;它用于在构建时确定哪些页面需要被预渲染。它需要返回一个包含params属性的对象数组&#xff0c;其中每个对象都代表一个路径参数集合&#xff0c;可以被预渲染为一个静态页面。如果所有参数都已知&#xff0c;它们将被硬…...

msys2+minGW方案编译ffmpeg的最佳实践

一、Win10 64bit编译环境的建立1&#xff09;从http://www.msys2.org/下载 msys2-x86_64-xxx.exe2&#xff09; 安装msys2到默认路径 C:\msys64\3&#xff09; 运行MSYS2 w644&#xff09;执行 pacman -Syu 更新系统当出现提示时&#xff0c;选择y5) 当窗口关闭时&#xff0c;重…...

理解redis的数据结构

redis为什么快&#xff1f; 首先可以想到内存读写数据本来就快&#xff0c;然后IO复用快&#xff0c;单线程没有静态消耗和锁机制快。 还有就是数据结构的设计快。这是因为&#xff0c;键值对是按一定的数据结构来组织的&#xff0c;操作键值对最终就是对数据结构进行增删改查操…...

Lecture6 逻辑斯蒂回归(Logistic Regression)

目录 1 常用数据集 1.1 MNIST数据集 1.2 CIFAR-10数据集 2 课堂内容 2.1 回归任务和分类任务的区别 2.2 为什么使用逻辑斯蒂回归 2.3 什么是逻辑斯蒂回归 2.4 Sigmoid函数和饱和函数的概念 2.5 逻辑斯蒂回归模型 2.6 逻辑斯蒂回归损失函数 2.6.1 二分类损失函数 2.…...