程序代码篇---C++常量引用


文章目录

  • 前言
  • 第一部分:C++常量
    • 常量变量
    • const与指针
      • 1.指向常量的指针
      • 2.常量指针
      • 3.指向常量的常量指针
    • 常量成员函数
    • const_cast运算符
    • 总结
  • 第二部分:C++引用
    • 引用的基本概念
    • 引用的声明
    • 引用的使用
    • 引用的特性
      • 1.不可变性
      • 2.无需解引用
      • 3.内存地址
    • 引用的用途
      • 1.函数参数传递
      • 2.函数的返回值
    • 引用的限制
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了C++中的const常量、&引用。


第一部分:C++常量

在C++中,const关键字用于声明变量为常量,即其值在初始化后不能被修改。const可以用于多种上下文中,包括变量、函数、成员函数和指针。以下是关于C++中const的详细解释:

常量变量

使用const声明的变量必须在声明时或构造时初始化,之后其值不能被改变。

const int MAX_SIZE = 100; // 声明并初始化一个常量
// MAX_SIZE = 200; // 错误:不能修改常量的值

const与指针

C++中,const可以与指针一起使用,有以下几种情况:

1.指向常量的指针

指向常量的指针(Pointer to Constant): 指针指向的数据是常量,不能通过指针修改数据,但指针本身可以指向其他地址。

int value = 10;
const int* ptr = &value; // ptr指向一个int类型的常量
// *ptr = 20; // 错误:不能通过ptr修改值
ptr = &another_value; // 正确:可以改变ptr指向的地址

2.常量指针

常量指针(Constant Pointer): 指针本身是常量,一旦初始化,指针的地址不能改变,但可以通过指针修改指向的数据。

int value = 10;
int another_value = 20;
int* const ptr = &value; // ptr是一个指向int的常量指针
*ptr = 20; // 正确:可以通过ptr修改value的值
// ptr = &another_value; // 错误:不能改变ptr指向的地址

3.指向常量的常量指针

指向常量的常量指针(Constant Pointer to Constant): 指针本身和它指向的数据都是常量,都不能被修改。

int value = 10;
const int* const ptr = &value; // ptr是一个指向int类型常量的常量指针
// *ptr = 20; // 错误:不能通过ptr修改值
// ptr = &another_value; // 错误:不能改变ptr指向的地址

常量成员函数

在类中,可以使用const关键字声明成员函数,表示该函数不会修改类的任何非静态成员变量

class MyClass {
public:void modify() { /* 可以修改成员变量 */ }void display() const { /* 不能修改成员变量 */ }
};

如果成员函数被声明为const,则在函数体内不能修改成员变量也不能调用非const成员函数

const_cast运算符

const_cast是C++中用于类型转换的运算符之一,它可以用来添加或移除const属性。

const int a = 10;
int* b = const_cast<int*>(&a); // 移除a的const属性
*b = 20; // 现在可以通过b修改a的值,但这通常是不安全的做法

需要注意的是,使用const_cast去除const属性是一种未定义行为,除非原始对象不是const,或者在修改后没有再次通过const引用或指针访问它。

总结

const在C++中用于声明不应该被修改的变量、指针和成员函数。正确使用const可以提高代码的可读性和安全性,因为它清楚地告诉编译器和程序员哪些数据是不应该被改变的。此外,const还可以帮助编译器进行优化,因为它提供了更多的信息关于变量的使用方式。

第二部分:C++引用

在C++中,引用是一种特殊的语法,它为已存在的变量提供了一个别名。引用在很多方面与指针类似,但它们的使用方式和语义有所不同。以下是关于C++中引用的详细解释:

引用的基本概念

  1. 引用是另一个变量的别名它在声明时必须被初始化,并且一旦初始化,就不能再成为其他变量的引用。
  2. 引用不是对象,它只是为一个已存在的对象提供了一个额外的名字。
  3. 引用必须在声明时进行初始化,且不能重新绑定到另一个对象。

引用的声明

引用的声明使用&符号,如下所示:

int var = 10;
int& ref = var; // ref是var的引用

在这个例子中,ref是var的引用,它们共享相同的内存地址和数据

引用的使用

引用在很多情况下可以像普通变量一样使用:

可以通过引用来读取和修改所引用的变量的值
引用可以传递给函数,允许函数直接修改调用者的变量

void modify(int& r) {r = 20; // 修改引用所绑定的变量
}int main() {int var = 10;int& ref = var;modify(ref); // 通过引用传递变量// 现在 var 的值是 20return 0;
}

引用的特性

1.不可变性

不可变性:一旦引用被初始化,它就不能被重新绑定到另一个对象

2.无需解引用

无需解引用:与指针不同,引用不需要使用*来访问所引用的值

3.内存地址

内存地址:引用与所引用的变量共享相同的内存地址

int var = 10;
int& ref = var;
cout << &var << " " << &ref; // 输出相同的地址

引用的用途

1.函数参数传递

函数参数传递:使用引用可以避免复制大的对象,提高函数调用的效率。(直接操作地址)

2.函数的返回值

函数返回值:可以使用引用作为函数的返回值,允许函数返回一个变量而不是变量的副本

int& getVar() {static int var = 10;return var; // 返回局部静态变量的引用
}int main() {int& ref = getVar();ref = 20; // 修改通过引用返回的变量return 0;
}

引用的限制

  1. 引用必须在声明时初始化。
  2. 不能有引用的数组(例如,int& arr[10];是非法的)。
  3. 不能有指向引用的指针(例如,int&* p;是非法的)。
  4. 悬挂引用:如果引用了一个临时对象或者局部变量,并且该对象在引用之后被销毁,那么引用将成为悬挂引用,这会导致未定义行为。
int& getRef() {int var = 10; // 局部变量return var; // 返回局部变量的引用,这是危险的!
}int main() {int& ref = getRef(); // 悬挂引用// 使用ref可能导致未定义行为return 0;
}

在上述代码中,getRef函数返回局部变量的引用,这是一个非常糟糕的做法,因为它会在函数返回后留下一个悬挂引用

总结来说,引用是C++中一个非常强大的特性,它提供了方便的语法和高效的性能,但同时也需要谨慎使用,以避免悬挂引用和其他潜在的问题。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了C++中的const常量、&引用。

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

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

相关文章

【C语言】结构体与共用体深入解析

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;和共用体&#xff08;union&#xff09;都是用来存储不同类型数据的复合数据类型&#xff0c;它们在程序设计中具有重要的作用。 推荐阅读&#xff1a;操作符详细解说&#xff0c;让你的编程技能更上一层楼 1. 结构体…

LLM架构与优化:从理论到实践的关键技术

标题&#xff1a;“LLM架构与优化&#xff1a;从理论到实践的关键技术” 文章信息摘要&#xff1a; 文章探讨了大型语言模型&#xff08;LLM&#xff09;开发与应用中的关键技术&#xff0c;包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论&#xff0c;以…

思维练习题

目录 第一章 假设法1.题目1. 如何问问题2. 他们的职业是分别什么3. 谁做对了4. 鞋子的颜色 2.答案 空闲时间写一些思维题来锻炼下思维逻辑&#xff08;题目均收集自网上&#xff0c;分析推理为自己所写&#xff09;。 第一章 假设法 一个真实的假设往往可以让事实呈现眼前&…

【C++高并发服务器WebServer】-10:网络编程基础概述

本文目录 一、MAC地址二、IP地址三、子网掩码四、TCP/IP四层模型五、协议六、socket七、字节序 一、MAC地址 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件&#xff0c;又称为网络适配器或网络接口卡NIC。其拥有 MAC 地址&#xff0c;属于 OSI模型的第2层…

为何SAP S4系统中要设置MRP区域?MD04中可否同时显示工厂级、库存地点级的数据?

【SAP系统PP模块研究】 一、物料主数据的MRP区域设置 SAP ECC系统中想要指定不影响MRP运算的库存地点,是针对库存地点设置MRP标识,路径为:SPRO->生产->物料需求计划->计划->定义每一个工厂的存储地点MRP,如下图所示: 另外,在给物料主数据MMSC扩充库存地点时…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

C++ | 红黑树

前言 本篇博客讲解c中数据结构红黑树&#xff0c;看这篇博客之前请先去看&#xff1a; C | AVL树_c avl树能有重复节点吗-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青…

C语言从入门到进阶

视频&#xff1a;https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…

一文讲解Java中Object类常用的方法

在Java中&#xff0c;经常提到一个词“万物皆对象”&#xff0c;其中的“万物”指的是Java中的所有类&#xff0c;而这些类都是Object类的子类&#xff1b; Object主要提供了11个方法&#xff0c;大致可以分为六类&#xff1a; 对象比较&#xff1a; public native int has…

51.和的逆运算问题|Marscode AI刷题

1.题目 问题描述 n 个整数两两相加可以得到 n(n - 1) / 2 个和。我们的目标是&#xff1a;根据这些和找出原来的 n 个整数。 按非降序排序返回这 n 个数&#xff0c;如果无解&#xff0c;输出 "Impossible"。 测试样例 样例1&#xff1a; 输入&#xff1a;n 3, …

SpringAI 搭建智能体(一):让模型执行客户端操作

在现代 AI 应用中&#xff0c;仅仅通过模型生成文本并不能满足复杂场景的需求。许多情况下&#xff0c;模型需要调用客户端的工具或函数来完成某些特定任务&#xff0c;例如查询数据库、访问第三方 API、执行系统命令等。Spring AI 提供了工具调用功能&#xff0c;使开发者可以…

Zemax 中的屋脊棱镜建模

光学棱镜是一种透明的光学元件&#xff0c;其表面平坦且抛光&#xff0c;可以折射光线。最常见的棱镜类型是三棱镜&#xff0c;它有两个三角形底座和三个矩形或略呈梯形的表面。棱镜通常由玻璃或丙烯酸等材料制成。当光线以一定角度进入棱镜时&#xff0c;它会在穿过棱镜时发生…

目标跟踪之sort算法(3)

这里写目录标题 1 流程1 预处理2 跟踪 2 代码 参考&#xff1a;sort代码 https://github.com/abewley/sort 1 流程 1 预处理 1.1 获取离线检测数据。1.2 实例化跟踪器。2 跟踪 2.1 轨迹处理。根据上一帧的轨迹预测当前帧的轨迹&#xff0c;剔除到当前轨迹中为空的轨迹得到当前…

solidity高阶 -- 线性继承

Solidity是一种面向合约的高级编程语言&#xff0c;用于编写智能合约。在Solidity中&#xff0c;多线继承是一个强大的特性&#xff0c;允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承&#xff0c;并通过不同的实例展示其使用方法和注意事项。 在Sol…

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型&#xff1a;有限个元素参与抽样&#xff0c;每个元素被抽样的概率相等。 条件概率&#xff1a;在某条件已经达成的前提下&#xff0c;新事件发生的概率。实际计算的时候&#xff0c;应注意区分&#xff0c;如果是计算综…

双目立体校正和Q矩阵

立体校正 对两个摄像机的图像平面重投影&#xff0c;使二者位于同一平面&#xff0c;而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R&#xff0c;T) 从上图中可以看出&#xff0c;该算法主要分为两步&#xff1a; 使成像平面共面 这个办法很直观&#xff…

软件开发中的密码学(国密算法)

1.软件行业中的加解密 在软件行业中&#xff0c;加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密&#xff08;Encryption&#xff09;是将明文数据转换为密文的过程&#xff0c;而解密&#xff08;Decryption&#xff09;则是将密文恢复为明文的过程。以下…

C语言练习(29)

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子&#xff0c;找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…

postgres基准测试工具pgbench如何使用自定义的表结构和自定义sql

使用 pgbench 进行 PostgreSQL 性能测试时&#xff0c;可以自定义表结构和测试脚本来更好地模拟实际使用场景。以下是一个示例&#xff0c;说明如何自定义表结构和测试脚本。 自定义表结构 创建自定义表结构的 SQL 脚本。例如&#xff0c;创建一个名为 custom_schema.sql 的文…