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

【C/C++基础知识】const 关键字

文章目录

    • Q&A and 前言
    • const 修饰基本变量
      • 初始化
      • const 对象仅在文件内有效
    • const 的引用
      • 应用
    • 指针与 const
    • const 修饰类成员函数
    • 参考
    • 写在最后

Q&A and 前言

Q:简要说一说 C++ 中的 const 关键字,含义以及常见的使用位置

A:const 是 C++ 中的一种关键字,用来对变量加以限制,无法被修改,额…

Q:具体说一下常量指针与指针常量,以及你是如何区分的

A:常量指针是 const pointer,指针常量是 pointer to const,额…

Q:好的,今天的面试到此结束,出去把门带上…


const 关键字是 C++程序语言开发岗位 面试经常考察的一个知识点,这个问题牵涉的考察面特别广,从 const 能问到指针、指针常量、常量指针、指向常量的常量指针、常量引用、常函数,甚至能问到函数的几种传参形式。今天就来看一看 const 关键字的几种用法。

const 修饰基本变量

有时候我们想定义一种值不能被改变的变量。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区的大小不合适的时候,很容易可以对其进行调整。另一方面,我们应该防止程序一不小心改变了这个值。为了满足这一要求,可以将这一变量定义为 const 类型加以限制:

const int bufferSize = 512;

这样就把 bufferSize 定义成一个常量。任何试图为 bufferSize 赋值的行为都会引发错误。

初始化

const 是英文单词 constant 的缩写形式,表示常数、恒定的意思。使用该关键字修饰变量表示变量是恒定的,不可以改变的。因为 const 对象一旦创建后其值不能被改变,所以 const 对象必须初始化。初始值可以是任何复杂的表达式:

const int i = get_size();  // 正确:运行时初始化
const int j = 42;		  // 正确:编译时初始化
const int k;			  // 错误:没有初始化

不论是常量对象还是非常量对象都可以初始化常量对象,同样的普通对象也可以使用常量对象进行初始化。

int i = 42;
const int ci = i;		// 正确:i的值被拷贝给了 ci
int j = c1;			    // 正确:ci 的值被拷贝给了 j

尽管 ci 是整型常量,但无论如何 ci 中的值还是一个整型数。ci 的常量特征仅仅在执行改变 ci 的操作时才会发挥作用。当用 ci 去初始化 j 时,根本无须在意 ci 是不是一个常量。

const 对象仅在文件内有效

当以编译器初始化的方式定义一个 const 对象时:

const int bufferSize = 512;

编译器将在编译过程中把用到 bufferSize 的地方都替换为 512.

为了执行上述替换,编译器必须知道变量的初始值,如果程序包含多个文件,则每个用了 const 对象的文件必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都有对它的定义。为此,在默认情况下,const 对象被设定为仅在文件内有效。当多个文件中出现同名的 const 变量时,其实等于在不同的文件中分别定义了独立的变量。

有些时候,我们希望在一个文件中定义 const 变量,在其他文件中声明并使用。解决的方法是,对于 const 变量不管是声明还是定义都增加 extern 关键字,这样只需要定义一次就可以了:

// file1.cpp 定义并初始化一个常量,该常量能被其他文件访问
extern const int bufferSize = fcn();
// file2.h
extern const int bufferSize;	// 与 file1.cpp 中定义的 bufferSize 是同一个

如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字。

const 的引用

引用可以绑定在常量对象上,也可以绑定在非常量对象上。无论引用的对象是常量还是非常量都不会影响引用和对象的绑定关系本身。只有那些不能通过引用改变它绑定的对象的引用,才被称为常量引用。换言之,常量运用不能通过引用改变它绑定的对象。

常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。因为对象可能是个非常量,所以允许通过其他途径改变它的值:

int i = 42;
int &r1 = i;		// 引用 r1 绑定对象 i
const int &r2 = i;	// r2 也绑定对象 i,但是不允许通过 r2 修改 i 的值
r1 = 0;				// r1 并非常量,可以通过引用 r1 修改 i
r2 = 0;				// 错误:r2 是一个常量引用

应用

常量引用主要用于以下几种情况:

函数参数传递:在函数定义中,使用常量引用作为参数,可以确保传递给函数的参数不会被修改,并且避免了不必要的数据复制。

void myFunction(const int& x) {// 在函数中不能修改 x 的值// 可以安全地使用 x
}

遍历容器:使用范围 for 循环遍历容器时,如果不需要修改容器的元素,可以使用常量引用来提高性能并确保容器不会被修改。

std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& num : numbers) {// 通过常量引用遍历容器,避免了不必要的复制,并确保容器不会被修改
}

返回值类型:在函数返回引用类型时,如果返回的对象是常量且不应该被修改,可以使用常量引用作为返回类型,以避免不必要的复制。

const std::string& getMessage() {static std::string message = "Hello, world!";return message; // 返回常量引用,避免了不必要的复制,并确保返回的对象不会被修改
}

总的来说,常量引用是一种有效的方式,用于提高性能、确保数据的不可修改性,并避免不必要的数据复制。对于确定不需要修改的对象,建议写成常量引用的形式。

指针与 const

指针与 const 主要包括以下内容:

  • pointer to const
  • const pointer
  • const pointer points to const

如果对这些内容已经了然于胸,完全可以跳过这一小节,如果有不清楚的地方,可以参考 【C/C++基础】指针与const。

const 修饰类成员函数

在自定义的数据类型(类)中,常常会发现某些成员函数的函数参数列表之后有 const 关键字,这样的成员函数被称为常量成员函数。

const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数,这也是建议的写法。

参考

《C++ Primer 中文(第5版)》

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家对 const 有更完整的整理或更清晰的认识,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

相关文章:

【C/C++基础知识】const 关键字

文章目录 Q&A and 前言const 修饰基本变量初始化const 对象仅在文件内有效 const 的引用应用 指针与 constconst 修饰类成员函数参考写在最后 Q&A and 前言 Q&#xff1a;简要说一说 C 中的 const 关键字&#xff0c;含义以及常见的使用位置 A&#xff1a;const 是 C…...

Docker之数据卷和Dockerfile

Docker之数据卷与Dockerfile的详细使用介绍如下&#xff1a; 一、Docker数据卷 数据卷&#xff08;volume&#xff09;是Docker中的一个重要概念&#xff0c;它允许你在容器和宿主机或容器之间共享文件系统。数据卷提供了持久性存储&#xff0c;即使在容器被删除后&#xff0…...

pull拉取最新代码

工作区、暂存区、版本库 工作区&#xff1a;就是你在电脑里能看到的目录。 暂存区&#xff1a;英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时也叫作索引&#xff08;index&#xff09;。 …...

工控 modbusTCP 报文

Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 Rx 接收报文:00 C9 00 00 00 07 01 03 04 01 4D 00 01 Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 00 C9 事务处理标识符 2字节 00 00 协议标识符 2字节 固定 00 00 00 06 长度 2字节 表示之后的字节总数 &#xff08;…...

在Ubuntu服务器上快速安装一个redis并提供远程服务

一、快速安装一个Redis 第一步&#xff1a;更新apt源 sudo apt update第二步&#xff1a;下载Redis sudo apt install redis第三步&#xff1a;查看Redis是否已自启动 systemctl status redis二、配置Redis提供远程服务 第一步&#xff1a;先确保6379端口正常开放 如果是…...

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…...

Bilstm双向长短期神经网络多输入单输出回归分析

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 Bilstm双向长短期神经网络多输入单输出回归分析 完整代码: Bilstm双向长短期神经网络多输入单输出回归分析.zip资源-CSDN文库 https://download.csdn.net/download/abc991835105/89087121 效果图 结果分析 展望 …...

ELK+Filebeat日志分析系统

一、ELK基本介绍&#xff1a; 1.ELK 简介: ELK平台是一套完整的日志集中处理解决方案(日志系统)。 将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ELK --> ELFK --> ELFKMQ2.ELK组件介绍…...

flex吃干抹净

Flex 布局是什么&#xff1f; Flex 是 Flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 .box{display: flex;//行内元素也可以使用flex布局//display: inline-flex; }display: flex; 使元素呈现为块级元素&#xff0c;…...

【单片机毕业设计8-基于stm32c8t6的RFID校园门禁系统】

【单片机毕业设计8-基于stm32c8t6的RFID校园门禁系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇8基于stm32的RFID校园门禁系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -----------…...

uni-app web端使用getUserMedia,摄像头拍照

<template><view><video id"video"></video></view> </template> 摄像头显示在video标签上 var opts {audio: false,video: true }navigator.mediaDevices.getUserMedia(opts).then((stream)> {video document.querySelec…...

2024-简单点-观察者模式

先看代码&#xff1a; # 导入未来模块以支持类型注解 from __future__ import annotations# 导入抽象基类模块和随机数生成器 from abc import ABC, abstractmethod from random import randrange# 导入列表类型注解 from typing import List# 定义观察者模式中的主体接口&…...

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…...

【JavaEE初阶系列】——网络编程 TCP客户端/服务器 程序实现

目录 &#x1f6a9;TCP流套接字编程 &#x1f36d;ServerSocket API &#x1f36d;Socket API &#x1f36d;TCP服务器 &#x1f36d;TCP客户端 &#x1f6a9;TCP流套接字编程 俩个关键的类 ServerSocket (给服务器使用的类&#xff0c;使用这个类来绑定端口号&#xff0…...

CMake构建OpenCv并导入QT项目过程中出现的问题汇总

前言 再此之前请确保你的环境变量是否配置&#xff0c;这是总共需要配置的环境变量 E:\cmake\bin E:\OpenCv\opencv\build\x64\vc15\bin F:\Qt\Tools\mingw730_64\bin F:\Qt\5.12.4\mingw73_64\bin 问题一&#xff1a; CMake Error: CMake was unable to find a build program…...

AcWing 796. 子矩阵的和——算法基础课题解

AcWing 796. 子矩阵的和 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个询问&#xff0c;每个询问包含四个整数 x1,y1,x2,y2&#xff0c;表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n&…...

macos 查看 远程服务器是否开放某个端口

想要使用mac查看远程服务器某个端口是否开发&#xff0c;可通过 nc 命令&#xff0c;如下&#xff1a; nc -zv <服务器IP> <端口号>如果该端口开发&#xff0c;结果为&#xff1a;succeeded! Connection to <服务器IP> port <端口号> [类型] succeed…...

GraphQL注入

GraphQL概述 GraphQL是一种查询语言&#xff0c;用于API设计和数据交互&#xff0c;不仅仅用于查询数据库。GraphQL 允许客户端在一个请求中明确地指定需要的数据&#xff0c;并返回预期的结果&#xff1b;并且将数据查询和数据修改分离开&#xff0c;大大增加灵活性。GraphQL…...

以太坊源码阅读01

正所谓区块链&#xff0c;怎能不熟悉区块的数据结构呢&#xff1f;区块的结构体被保存在core/types/block.go文件中&#xff0c;下面是我截取出来的&#xff1a; type Block struct {header *Headeruncles []*Headertransactions Transactionswithdrawals Withdr…...

Spark-Scala语言实战(15)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的学习键值对方法中的lookup&#xff0c;cogroup两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...