Effective C++ 条款 03:尽可能使用 const

文章目录

  • 条款 03:尽可能使用 `const`
    • 1. `const` 在指针中的使用
    • 2. `const` 在迭代器中的使用
    • 3. `const` 修饰函数返回值
    • 4. `const` 在成员函数中的应用
      • `bitwise constness`
      • `logical constness`
    • 5. 避免代码重复的技巧
    • 6. 总结

条款 03:尽可能使用 const

const 是 C++ 中一个重要的关键字,能够帮助开发者表达和维护程序的“不变性”约束,从而提高代码的安全性和可读性。


1. const 在指针中的使用

根据 const 在声明中的位置,含义不同:

  • const 出现在星号左边:表示被指物是常量,例如:

    const int* p;
    表示 *p 是只读的,不能被修改,但指针 p 可以指向其他对象。

  • const 出现在星号右边:表示指针本身是常量,例如:

    int* const p;
    表示 p 是固定不变的,但 *p 的内容可以修改。

  • const 两边都有:表示被指物和指针本身都是常量,例如:

    const int* const p;
    表示 p 不能修改,*p 也不能修改。


2. const 在迭代器中的使用

声明迭代器为 const 类似于声明一个 T* const 指针,表示迭代器本身不可修改。如果希望迭代器所指的值不可修改(即模拟 const T*),应使用 const_iterator


3. const 修饰函数返回值

const 修饰函数返回值时,表示返回值是只读的。例如:

const int getValue();
表示返回的整数不能被修改,这通常用于防止调用者改变返回的内容。


4. const 在成员函数中的应用

bitwise constness

  • 一个成员函数只有在不改变对象的任何成员变量(static 除外)时,才能标记为 const
  • 编译器会强制检查这一规则。

logical constness

  • 逻辑上的常量性允许成员函数修改某些 bits,但这些修改对调用者不可见。
  • 这种情况需要使用 mutable 关键字来解除 bitwise constness 的限制。例如:

    mutable int cache;
    表示 cache 即使在 const 函数中也可以修改。


5. 避免代码重复的技巧

const 和非 const 成员函数具有实质等价的实现时,可以令非 const 版本调用 const 版本,避免重复代码。以下是示例:

class TextBlock {
public:// const 版本的运算符重载const char& operator[](std::size_t position) const {// 返回 text[position],该版本不能修改 TextBlock 对象的内容return text[position];}// 非 const 版本的运算符重载char& operator[](std::size_t position) {// 通过 const_cast 去除 const 属性,然后调用 const 版本的运算符重载return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);}
};

这种方式避免了为类似逻辑重复编写实现。


6. 总结

  • 使用 const 可以帮助编译器检测错误的用法。
  • const 可用于任何作用域内的对象、函数参数、函数返回类型和成员函数。
  • 编译器强制实施 bitwise constness,但开发者应更关注“概念上的常量性”。
  • 通过 mutable 可以释放对某些非静态成员变量的 bitwise constness 限制。
  • 通过让非 const 成员函数调用 const 版本,可简化代码并减少重复。

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

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

相关文章

CentOS7系统下部署tomcat,浏览器访问localhost:8080/

我这里以本地的VMware虚拟机创建的CentOS为例,来讲解部署tomcat的步骤,阿里云的服务器ECS部署只需设置下安全组规则即可,Centos内一样。 首先启动VM,输入密码进入centos,用xshell连接 2. 在家目录输入 cd /usr/local 进入local目录, 输入 mkdir java &#xff0c;创建java目录…

解析 Ingress-Nginx 故障:排查思路与方法

文章目录 一、什么是Ingress-Nginx二、故障排除1.1Ingress-Controller日志和事件检查 Ingress 资源事件检查 Nginx 配置检查使用的服务是否存在调试日志 1.2对 Kubernetes API 服务器的认证服务认证服务账户Kube-Config 1.3使用GDB和Nginx1.4在 Nginx 4.2.5 或其他版本&#xf…

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…

【实操之 图像处理与百度api-python版本】

1 cgg带你建个工程 如图 不然你的pip baidu-aip 用不了 先对图片进行一点处理 $ 灰度处理 $ 滤波处理 参考 import cv2 import os def preprocess_images(input_folder, output_folder):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_fol…

【LuaFramework】LuaFramework_UGUI_V2框架学习

GitHub - jarjin/LuaFramework_UGUI_V2: 基于tolua的热更新框架V2 旧版本是Unity 5.0&#xff0c;这个是新版本支持更高版本的 导入工程后先清除wrap 然后重新生成wrap&#xff0c;你会发现有个报空null&#xff0c;框架的问题总结下所有的框架wrap相关报错问题和修复方法&…

重温设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…

16×16LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告+仿真+单片机源程序)

资料下载地址&#xff1a;​1616LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告仿真单片机源程序)​ 1、功能介绍 设计1616点阵LED显示器的驱动电路&#xff0c;并编写程序实现在1616点阵LED显示器上的字符滚动显示。1616点阵LED显示器可由4块88点阵LED显示器构成。可采…

Scala图书管理系统

项目创建并实现基础UI package org.appimport scala.io.StdInobject Main {def main(args: Array[String]): Unit {var running truewhile (running) {println("欢迎来到我的图书管理系统&#xff0c;请选择")println("1.查看所有图书")println("2…

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)

文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…

WPF+MVVM案例实战与特效(四十八)-实现一个自定义饼状图控件

文章目录 1、案例效果2、案例实现1、PieControl.xaml 代码2、样式代码如下:1、案例效果 2、案例实现 1、PieControl.xaml 代码 代码如下(示例): namespace PieControl {public class PieControl: Control

玩转OCR | 探索腾讯云智能结构化识别新境界

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 玩转OCR 腾讯云智能结构化识别产品介绍服务应用产品特征行业案例总结 腾讯云智能结构化识别 腾讯云智能结构化OCR产品分为基础版与高级版&am…

「下载」智慧城市“一网统管”总体框架全解析:整体架构、运营体系规划、具体运营内容、典型场景、运营工具平台

智慧城市“一网统管”&#xff0c;通过先进的信息技术手段&#xff0c;实现城市管理的智能化、协同化、精准化和高效化。 本文将基于《智慧城市“一网统管”运营研究报告2024》的内容&#xff0c;从发展背景及趋势、“一网统管”运营总体框架、运营体系规划、“一网统管”运营内…

突破续航瓶颈:数字样机技术引领新能源汽车复合制动新方向

随着我国经济快速发展和人民生活水平不断提升&#xff0c;汽车保有量截至2023年9月底就已达到了3.3亿&#xff0c;同比增长6.32%。庞大的汽车保有量对我国的环境和能源都产生了巨大的压力&#xff0c;具备节能环保优势的新能源汽车对于有效解决环境恶化和能源危机问题具有重要意…

建投数据与腾讯云数据库TDSQL完成产品兼容性互认证

近日&#xff0c;经与腾讯云联合测试&#xff0c;建投数据自主研发的人力资源信息管理系统V3.0、招聘管理系统V3.0、绩效管理系统V2.0、培训管理系统V3.0通过腾讯云数据库TDSQL的技术认证&#xff0c;符合腾讯企业标准的要求&#xff0c;产品兼容性良好&#xff0c;性能卓越。 …

电力通信规约-104实战

电力通信规约-104实战 概述 104规约在广泛应用于电力系统远动过程中&#xff0c;主要用来进行数据传输和转发&#xff0c;本文将结合实际开发实例来讲解104规约的真实使用情况。 实例讲解 因为个人技术栈是Java&#xff0c;所以本篇将采用Java实例来进行讲解。首先我们搭建一…

【3D打印机】启庞KP3S热床加热失败报错err6

最近天冷&#xff0c;打印机预热突然失败&#xff0c;热床无法加热&#xff0c;过了一段时间报错err6&#xff0c;查看另一篇资料说是天气冷原因&#xff0c;导致代码的PID控温部分达不到预期加热效果&#xff0c;从而自检报错&#xff0c;然后资料通过修改3D打印机代码的方式进…

SpiderFlow平台v0.5.0流程的执行过程

流程执行过程&#xff1a; 1. 流程启动 流程的执行通常从一个 开始节点 开始&#xff0c;该节点是整个爬虫任务的起点。开始节点没有实际的功能作用&#xff0c;主要作用是标记流程的起始。 执行顺序&#xff1a;在执行过程中&#xff0c;系统按照流程中的连接线顺序依次执行…

MySQL追梦旅途之慢查询分析建议

一、找到慢查询 查询是否开启慢查询记录 show variables like "%slow%";log_slow_admin_statements&#xff1a; 决定是否将慢管理语句&#xff08;如 ALTER TABLE 等&#xff09;记录到慢查询日志中。 log_slow_extra &#xff1a; MySQL 和 MariaDB 中的一个系…

Liveweb视频融合共享平台在果园农场等项目中的视频监控系统搭建方案

一、背景介绍 在我国的大江南北遍布着各种各样的果园&#xff0c;针对这些地处偏僻的果园及农场等环境&#xff0c;较为传统的安全防范方式是建立围墙&#xff0c;但是仅靠围墙仍然无法阻挡不法分子的有意入侵和破坏&#xff0c;因此为了及时发现和处理一些难以察觉的问题&…

【Jenkins】持久化

文章目录 持续集成CI持续部署CD部署部署到linux服务器 持续集成好处&#xff1a; 持续集成CI 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;指的是频繁地&#xff08;一天多次&#xff09;将代码集成到主干。 持续集成的目的就是让产品可以快速…