C++ const引用(这里不讲返回,只是讲引用,拷贝构造篇章会有更详细的讲解)

news/2024/9/20 0:34:42 标签: c++, 算法, 开发语言

个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

使用规则

  1. 引用常量对象:可以引用一个常量对象,但必须使用常量引用(const引用)。这是因为常量引用保证了不会通过引用来修改被引用的对象。

  2. 常量引用的灵活性:常量引用不仅可以引用常量对象,也可以引用普通(非常量)对象。这是因为引用的权限可以缩小(即常量引用可以绑定到非常量对象),但不能放大(即非常量引用不能绑定到常量对象)。

  3. 引用临时对象:在某些表达式中,如 int& rb = a * 3;int& rd = static_cast<int>(d);,表达式的结果可能被存储在临时对象中。这些临时对象是未命名的,由编译器创建用于存储表达式的结果。

  4. 临时对象的常性:C++标准规定,临时对象是常量,因此不能通过非常量引用来引用它们。只有常量引用可以绑定到临时对象。

  5. 权限放大问题:尝试通过非常量引用来引用临时对象会导致编译错误,因为这相当于权限放大,违反了C++的引用规则。

  6. 临时对象的定义:临时对象是编译器为了存储表达式的求值结果而创建的未命名对象。它们在表达式结束后通常会立即销毁,但通过常量引用可以延长其生命周期。

C++ const引用,权限放大问题

权限放大是问题,因为是不允许权限放大的

const会修饰的变量只能是可读的

#include<iostream>
#include<stdio.h>
int main()
{
	
	//不能进行权限放大,但是我们可以进行权限平移
	const int& a22 = a11;
	cout << "a22=" << a22 << endl << endl;
	cout << "&a11=" << &a11 << endl << "&a22=" << &a22 << endl << endl;//此时我们发现,地址依旧是一样的,因为这是一个别名的引用

	return 0;
}

C++ const引用,权限缩小

权限缩小不是问题,因为是允许权限缩小的

#include<iostream>
#include<stdio.h>
int main()
{

	//权限的缩小
	int a33 = 10;
	++a33;
	cout << "a33=" << a33 << endl;
	const int& a44 = a33;//此时权限缩小
	//++a44;//此时报错,因为权限缩小之后,内容不可修改
	cout << "&a33=" << &a33 << endl << "&a44=" << &a44 << endl << endl;

	return 0;
}

单纯的拷贝不存在权限问题

这里就是一个单纯的拷贝,没有引用,不存在权限问题

 const可以给常量取别名

给常量取别名的意义

  1. 保护数据:通过使用 const 引用,可以确保函数不会意外修改传入的常量参数。
  2. 提高效率:对于大型的数据结构,使用 const 引用作为函数参数可以避免不必要的拷贝,提高程序的运行效率。
  3. 延长生命周期:对于临时对象,使用 const 引用可以延长其生命周期,使其在引用的生命周期内保持有效。
const int original = 10; // 定义一个常量

const int& ref = original; // 用const引用给常量取别名
const int& refToTemp = 100; // 正确:临时对象可以绑定到const引用
// int& nonConstRef = 100; // 错误:临时对象不能绑定到非const引用

const引用(类型转化导致产生临时变量)

在C++中,"类型转换产生临时变量" 指的是在某些表达式中,由于类型不匹配,编译器会创建一个临时对象来存储表达式的结果,以便能够进行后续的操作。这个临时对象通常是一个右值(r-value),它只能被绑定到 const 引用上。

注意(后面拷贝构造会进行讲解)

  • 拷贝也会产生临时对象
  • 传值返回,表达式的结果中间都会产生临时对象

http://www.niftyadmin.cn/n/5666386.html

相关文章

关于实时数仓的几点技术分享

一、实时数仓建设背景 业务需求的变化&#xff1a;随着互联网和移动互联网的快速发展&#xff0c;企业的业务需求变得越来越复杂和多样化&#xff0c;对数据处理的速度和质量要求也越来越高。传统的T1数据处理模式已经无法满足企业的需求&#xff0c;实时数据处理成为了一种必…

点云深度学习系列:Sam2Point——基于提示的点云分割

文章&#xff1a;SAM2POINT:Segment Any 3D as Videos in Zero-shot and Promptable Manners 代码&#xff1a;https://github.com/ZiyuGuo99/SAM2Point Demo&#xff1a;https://huggingface.co/spaces/ZiyuG/SAM2Point 1&#xff09;摘要 文章介绍了SAM2POINT&#xff0c;这是…

【海康威视面经】

海康威视面经 Java基础java常用集合 及其优缺点ArrayListVectorLinkedList Jvm调优监控发现问题工具分析问题 &#xff1a;性能调优GC频繁 出现内存泄漏 内存溢出CPU飙升 Synchronized和Volatile的比较反射线程池和new thread利弊高并发 集群 分布式 负载均衡 MySQL调优基础优化…

SSL/TSL 总结

参考&#xff1a;https://blog.csdn.net/qq153471503/article/details/109524764 &#xff08;一&#xff09;生成CA证书 1、创建CA证书私钥 openssl genrsa -aes256 -out ca.key 2048 &#xff08;密码&#xff1a;ca1234567890&#xff09; 2、请求证书 openssl req -new -s…

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…

从零开始手搓Transformer#Datawhale组队学习Task1#

从零开始手搓Transformer 目录 缩放点积注意力DotProductAttention 多头注意力Multi-Head Attention 位置编码Position Encoder 前馈神经网络FFN 残差连接和层归一化&#xff08;Add&Norm&#xff09; 编码器Encoder 解码器Decoder 编码器-解码器Encoder-Decoder …

从零开始学PostgreSQL (十四):高级功能

目录 1. 简介 2. 视图 3. 外键 4. 事务 5. 窗口函数 6. 继承 7. 结论 简介 PostgreSQL是一个强大且开源的关系型数据库管理系统&#xff0c;以其稳定性、功能丰富性和对SQL标准的广泛支持而闻名。它不仅提供了传统的关系型数据库功能&#xff0c;如事务处理、外键约束和视图&am…

Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)

题目&#xff1a;*18.29(某个目录下的文件数目) 编写一个程序&#xff0c;提示用户输入一个目录&#xff0c;然后显示该目录下的文件数。 和上一题(18.28)的思路差不多&#xff0c;把找到文件后累加大小到变量变成计数1即可。 Java语言程序设计基础篇_编程练习题*18.28 (非递…