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

C++ const关键字有多种用法举例

C++ const关键字有多种用法

可以用来修饰变量、指针、函数参数、成员函数等。可以看到const在C++中有多种用法,主要用于保证数据的不可变性,增强代码的安全性和可读性。在实际编程中,根据需要选择适当的const用法,可以有效避免意外修改数据,提高程序的稳定性

以下是一些常见的用法及其示例:

1. 修饰普通变量

const可以用来声明常量,即变量的值在初始化后不能被修改。

#include <iostream>int main() {const int num = 10;// num = 20;  // Error: cannot assign to variable 'num' with const-qualified type 'const int'std::cout << "num: " << num << std::endl;return 0;
}

2. 修饰指针

const修饰指针时有多种情况,取决于const的位置。

2.1 指向常量的指针

指针本身可以改变,但不能通过该指针修改它所指向的值。

#include <iostream>int main() {int value = 10;const int *ptr = &value;// *ptr = 20;  // Error: read-only variable is not assignablevalue = 20;  // Allowed, since value itself is not constptr = nullptr;  // Allowed, ptr itself is not conststd::cout << "value: " << value << std::endl;return 0;
}

2.2 常量指针

指针本身是常量,但可以修改它所指向的值。

#include <iostream>int main() {int value = 10;int *const ptr = &value;*ptr = 20;  // Allowed, can modify the value pointed to// ptr = nullptr;  // Error: cannot assign to variable 'ptr' with const-qualified type 'int *const'std::cout << "value: " << value << std::endl;return 0;
}

2.3 指向常量的常量指针

指针本身和指向的值都不能改变。

#include <iostream>int main() {int value = 10;const int *const ptr = &value;// *ptr = 20;  // Error: read-only variable is not assignable// ptr = nullptr;  // Error: cannot assign to variable 'ptr' with const-qualified type 'const int *const'std::cout << "value: " << value << std::endl;return 0;
}

3. 修饰函数参数

const可以用来修饰函数参数,以保证函数内部不能修改参数的值。

3.1 按值传递的常量参数

这种情况虽然参数在函数内部不能修改,但因为按值传递,函数外部的变量不受影响。

#include <iostream>void printValue(const int value) {// value = 20;  // Error: cannot assign to variable 'value' with const-qualified type 'const int'std::cout << "Value: " << value << std::endl;
}int main() {int num = 10;printValue(num);return 0;
}
3.2 按引用传递的常量参数

这种情况既可以避免不必要的复制,又保证了函数内部不能修改参数的值。

#include <iostream>void printValue(const int &value) {// value = 20;  // Error: cannot assign to variable 'value' with const-qualified type 'const int &'std::cout << "Value: " << value << std::endl;
}int main() {int num = 10;printValue(num);return 0;
}

4. 修饰成员函数

const成员函数表示该函数不会修改对象的状态,不能修改类的成员变量(除非是用mutable关键字修饰的变量)。

#include <iostream>class MyClass {
public:int getValue() const {// value = 20;  // Error: cannot assign to non-static data member within const member functionreturn value;}void setValue(int v) {value = v;}private:int value = 10;
};int main() {MyClass obj;std::cout << "Value: " << obj.getValue() << std::endl;obj.setValue(20);std::cout << "Value: " << obj.getValue() << std::endl;return 0;
}

5. 顶层const和底层const

顶层const(Top-level const):指对象本身是常量,例如 const int a = 10;。
底层const(Low-level const):指对象的内容是常量,例如 const int *ptr;。

6. 修饰返回类型

const可以修饰返回类型,防止返回值被修改。

#include <iostream>class MyClass {
public:const int& getValue() const {return value;}private:int value = 10;
};int main() {MyClass obj;const int& val = obj.getValue();// val = 20;  // Error: cannot assign to variable 'val' with const-qualified type 'const int &'std::cout << "Value: " << val << std::endl;return 0;
}

7. 修饰常量表达式

constexpr是C++11引入的,用于声明常量表达式,保证表达式在编译时计算。

#include <iostream>constexpr int square(int x) {return x * x;
}int main() {const int result = square(5);std::cout << "Result: " << result << std::endl;return 0;
}

相关文章:

C++ const关键字有多种用法举例

C const关键字有多种用法 可以用来修饰变量、指针、函数参数、成员函数等。可以看到const在C中有多种用法&#xff0c;主要用于保证数据的不可变性&#xff0c;增强代码的安全性和可读性。在实际编程中&#xff0c;根据需要选择适当的const用法&#xff0c;可以有效避免意外修…...

Makefile-快速掌握

引用 本文完全参照大佬的文档写的&#xff0c;写这篇文章只是为了梳理一下知识 https://github.com/marmotedu/geekbang-go/blob/master/makefile/Makefile%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md 介绍 Makefile是一个工程文件的编译规则&#xff0c;描述了整个工程的编译…...

定个小目标之刷LeetCode热题(20)

这题与上一题有一点不同&#xff0c;上一题是判断链表是否存在环&#xff0c;这题是寻找入环的第一个节点&#xff0c;有一个规则是这样的&#xff0c;在存在环的情况下&#xff0c;运用快慢指针判断是否有环结束时&#xff0c;把快指针指向头结点&#xff0c;慢指针不变&#…...

短剧分销小程序:影视产业链中的新兴力量

一、引言 在数字化浪潮的推动下&#xff0c;影视产业正迎来一场深刻的变革。短剧分销小程序作为这场变革中的新兴力量&#xff0c;正以其独特的魅力和价值&#xff0c;逐渐在影视产业链中崭露头角。本文将探讨短剧分销小程序在影视产业链中的新兴地位、其带来的变革以及未来的…...

使用fvm切换flutter版本

切换flutter版本 下载fvm 1、dart pub global activate fvm dart下载fvm 2、warning中获取下载本地的地址 3、添加用户变量path&#xff1a; 下载地址 终端查看fvm版本 fvm --version 4、指定fvm文件缓存地址 fvm config --cache-path C:\src\fvm&#xff08;自定义地址&…...

python通过selenium实现自动登录及轻松过滑块验证、点选验证码(2024-06-14)

一、chromedriver配置环境搭建 请确保下载的驱动程序与你的Chrome浏览器版本匹配&#xff0c;以确保正常运行。 1、Chrome版本号 chrome的地址栏输入chrome://version&#xff0c;自然就得到125.0.6422.142 版本 125.0.6422.142&#xff08;正式版本&#xff09; &#xff08;…...

【C++】开源项目收集

C 是一种强大的、静态类型的通用编程语言&#xff0c;它的开源生态系统非常丰富&#xff0c;拥有众多高质量的项目。以下是一些知名的C开源项目&#xff1a; Boost: 这是一个庞大的库集合&#xff0c;提供了大量的实用工具和组件&#xff0c;如文件系统、网络编程、智能指针等&…...

爬虫相关面试题

一&#xff0c;如何抓取一个网站&#xff1f; 1&#xff0c;去百度和谷歌搜一下这个网站有没有分享要爬取数据的API 2, 看看电脑网页有没有所需要的数据&#xff0c;写代码测试调查好不好拿&#xff0c;如果好拿直接开始爬取 3&#xff0c;看看有没有电脑能打开的手机网页&a…...

Spring Cloud Netflix 之 Ribbon

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、负载均衡1.1、服务端负载均衡1.2、客户端负载均衡 2、Ribbon实现服务…...

C语言怎样记住那么多的颜⾊?

一、问题 ⾚、橙、⻩、绿、⻘、蓝、紫&#xff0c;如此之多的颜⾊&#xff0c;数字不好记&#xff0c;英⽂看程序还可以&#xff0c; 直接写也不好写。那么怎样记住那么多的颜⾊呢&#xff1f; 二、解答 颜⾊枚举值如下&#xff1a; enum COLORS {BLACK, /*O⿊*/BLUE, …...

LabVIEW软件开发任务的工作量估算方法

在开发LabVIEW软件时&#xff0c;如何准确估算软件开发任务的工作量。通过需求分析、功能分解、复杂度评估和资源配置等步骤&#xff0c;结合常见的估算方法&#xff0c;如专家判断法、类比估算法和参数估算法&#xff0c;确保项目按时按质完成&#xff0c;提供项目管理和资源分…...

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…...

Prometheus的四种指标类型

目录 一、Counter 计数器 1.1Counter 是计数器类型 1.2Counter 类型示例 二、Gauge 仪表盘 2.1Gauge是测量器类型 2.2Gauge 类型示例 三、Histogram 累积直方图 3.1Histogram 作用及特点 3.2使用 histogram 柱状图 四、Summary 摘要 一、Counter 计数器 1.1Counter …...

FastDFS SpringBoot 客户端 Demo搭建,支持文件上传下载

一、准备 fastdfs-client-java 依赖包 1、从 Git 下载 FastDFS java client SDK 源码 https://github.com/happyfish100/fastdfs-client-java.git<fastdfs-client-java 源码见附件> 2、使用ant从源码构建 ant clean package3、使用maven从源码安装 mvn clean instal…...

十大成长型思维:定位思维、商业思维、时间管理思维、学习成长思维、精力管理思维、逻辑表达思维、聚焦思维、金字塔原理、目标思维、反思思维

一、定位思维 定位思维是一种在商业和管理领域中至关重要的思维模式&#xff0c;它涉及到如何在顾客心智中确立品牌的独特位置&#xff0c;并使其与竞争对手区分开来。以下是关于定位思维的清晰介绍&#xff1a; 1、定义 定位思维是一种从潜在顾客的心理认知出发&#xff0c;通…...

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA&#xff0c;需要先按照Graphql插件&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;打开插件管理 在IDEA中&#xff0c;打开主菜单&#xff0c;选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …...

vue3+ Element-Plus 点击勾选框往input中动态添加多个tag

实现效果&#xff1a; template&#xff1a; <!--产品白名单--><div class"con-item" v-if"current 0"><el-form-item label"平台名称"><div class"contaion" click"onclick"><!-- 生成的标签 …...

唯美仙侠手游【九幽仙域】win服务端+GM后台+详细教程

资源下载地址&#xff1a;九幽仙域搭建-...

Qt creator day2练习

使用手动连接&#xff0c;将登录框中的取消按钮使用第二种方式&#xff0c;右击转到槽&#xff0c;在该函数中&#xff0c;调用关闭函数&#xff0c;将登录按钮使用Qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为“admin”&#xff0c;密…...

哪里有海量的短视频素材,以及短视频制作教程?

在当下&#xff0c;短视频已成为最火爆的内容形式之一&#xff0c;尤其是在抖音上。但很多创作者都面临一个问题&#xff1a;视频素材从哪里来&#xff1f;怎么拍摄才能吸引更多观众&#xff1f;别担心&#xff0c;今天我将为大家推荐几个宝藏网站&#xff0c;确保你素材多到用…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...