详细解析int GetLength() const;声明中的const是修饰什么的?

书籍:《Visual C++ 2017从入门到精通》的2.7.3 中的字符串

环境:visual studio 2022

内容:GetLength()

在 C++ 中,int GetLength() const; 声明中的 const 关键字用于修饰 ​成员函数本身,而非返回值。以下是详细解析:


1. const 的作用

  • 修饰成员函数
    const 表示该成员函数是一个 ​常量成员函数承诺 ​不会修改类的任何成员变量​(除非成员变量被声明为 mutable)。

    • 核心作用:保证函数执行期间对象的逻辑状态不变。
    • 调用限制:只能被 const 对象调用,普通对象也可调用。
  • 不修饰返回值
    返回值类型是 int,与 const 无关。若需返回常量值,需显式声明返回类型为 const int(但通常不需要)。


2. 示例代码解析

关键点
  1. 函数声明中的 const

    • 表示 GetLength() 是常量成员函数,不能修改 MyClass 的实例变量(如 length)。
    • 允许 const MyClass 对象调用该函数:
      const MyClass obj;
      int len = obj.GetLength(); // 合法
  2. 返回值类型

    • 返回值是 int,与 const 无关。即使返回值为 const int,也需显式声明:
      const int GetLength() const { return length; } // 返回 const int

3. const 成员函数的约束

  • 禁止修改成员变量

    int GetLength() const {length = 10; // 错误!不能修改成员变量return length;
    }
  • 允许读取 mutable 成员
    若成员变量被声明为 mutable,即使在 const 函数中也可修改

    class MyClass {mutable int cache; // 允许在 const 函数中修改
    public:int GetLength() const {cache = 100; // 合法return cache;}
    };

4. 为什么需要 const 成员函数?

  • 接口安全性
    明确函数的意图是只读操作,避免意外修改对象状态。
  • 兼容性
    允许 const 对象调用,增强代码灵活性。
  • 多线程安全
    在多线程环境中,const 函数可降低数据竞争风险。

5. 对比非 const 成员函数

特性const 成员函数非 const 成员函数
能否修改成员变量只能修改 mutable 成员可以修改所有成员变量
调用对象限制只能被 const 对象调用可被任意对象调用
代码安全性更高(防止意外修改)较低

6. 总结

  • ​**const 修饰的是成员函数本身**,表示该函数不会修改对象状态。
  • 返回值类型与 const 无关,可以是普通类型或 const 类型(需显式声明)。
  • 核心价值:通过约束函数行为,提升代码安全性和可维护性。

通过合理使用 const,可以设计出更健壮、清晰的类接口。

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

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

相关文章

央视少儿APP V2.6.2

安装好软件就能直接看,界面干净,播放流畅得很。里面的内容都是经过严格筛选的,动画、纪录片、教育课程这些资源应有尽有 这款软件的画质高清到让人惊艳,就算不登录也丝毫不影响观看体验,播放的时候几乎不用缓冲&#…

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称(例如 mydatabase),点击 ​Apply确认创建,点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…

比较4点结构和4次函数

在行列可自由变换的平面上3点结构只有6个 设与之对应的函数分别是 3a1 x*x*y y*y*x 3a2 xy*y*y 3a3 x*x*y y*y*y 3a4 x*x*x y*y*x 3a5 x*x*xy*y*y 3a6 x*x*xy 用同样的办法计算4点结构的16个函数 4(4a1-1)2*3a32*3a1 4(4a2-1)3a43a33a53a1 4(4a3-1)3a23a3…

线性回归 + 基础优化算法

线性回归 线性回归是机器学习最基础的模型,也是理解后续所有深度学习的基础。 线性模型可以看做是单层神经网络。 上述有个0.5是在求导的时候可以很方便的将2消去。 实际上,这里的数据样本受限很大,比如地球上房子就那么多,肯…

邪性!Anaconda安装避坑细节Windows11

#工作记录 最近不断重置系统和重装Anaconda,配置的要累死,经几十次意料之外的配置状况打击之后,最后发现是要在在Anaconda安装时,一定要选“仅为我安装”这个选项,而不要选“为所有用户安装”这个选项。 选“仅为我安…

llamafactory微调效果与vllm部署效果不一致如何解决

在llamafactory框架训练好模型之后,自测chat时模型效果不错,但是部署到vllm模型上效果却很差 这实际上是因为llamafactory微调时与vllm部署时的对话模板不一致导致的。 对应的llamafactory的代码为 而vllm启动时会采用大模型自己本身设置的对话模板信息…

修改菜品-02.代码开发

一.Controller层 package com.sky.controller.admin;import com.sky.dto.DishDTO; import com.sky.dto.DishPageQueryDTO; import com.sky.entity.Dish; import com.sky.result.PageResult; import com.sky.result.Result; import com.sky.service.DishService; import com.sk…

探秘Transformer系列之(19)----FlashAttention V2 及升级版本

探秘Transformer系列之(19)----FlashAttention V2 及升级版本 文章目录 探秘Transformer系列之(19)----FlashAttention V2 及升级版本0x00 概述0x01 FlashAttention V21.1 动机1.2 方案1.2.1 减少冗余计算1.2.2 增加并行1.2.3 调整…

解决HuggingFaceEmbeddings模型加载报错:缺少sentence-transformers依赖包

遇到报错 报错信息: Error loading model: Could not import sentence_transformers python package. Please install it with pip install sentence-transformers. 装包信息: pip install modelscope langchain sentence_transformers langchain-huggingface on…

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…

游戏引擎学习第188天

回顾并计划今天的内容 原本这周的目标是进行可视化操作的尝试,但每一天都被一些棘手的bug和问题所阻碍,导致我们一直没能实现这个目标。直到今天,星期四,我们终于解决了这些问题,所有功能都能正常运行了,所…

解决 FFmpeg 使用 C/C++ 接口时,解码没有 shell 快的问题(使用多线程)

一、问题 硬件设备为香橙派 5Plus,最近需要使用硬件视频解码来加速 YOLO 的检测,shell 窗口的FFmpeg已经调通,详见文章: 编译支持 RKmpp 和 RGA 的 ffmpeg 源码_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…

玛哈特液压式精密矫平机——以精准压力,定义金属的绝对服从

板材应力不除,良率难升。液压式精密矫平机,凭借多级液压闭环技术AI动态补偿算法,攻克0.2mm超薄钛箔至65mm装甲钢板的矫平极限,平整度精度锁定0.012mm,残余应力≤3MPa,让金属从“形似平整”迈向“分子级稳定…

食品计算—Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

C++11--(1)

目录 1.列表初始化 {}初始化 C98中 C11中 内置置类型和自定义类型 创建对象也适用 std::initializer_list 2.变量类型推导 auto C98 C11 decltype nullptr 3.范围for循环 4.STL中一些变化 array 1.创建和初始化 2.访问元素 ​编辑 3.修改操作 4.支持迭代器…

Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)

1. brew安装 mac需要先安装brew,如果本地已经安装过brew这一步可以忽略,遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败,因为…

内网服务器无法通过公网地址访问映射到公网的内网服务

内网服务器无法通过公网地址访问映射到公网的内网服务 问题现象问题原因解决方法总结 前几天遇到一个网络问题,在这里做下记录,希望能帮助到有相同问题的朋友。 问题现象 网络拓扑如上所示,服务器1和服务器2在同一内网,网段均为1…

mac 下配置flutter 总是失败,请参考文章重新配置flutter 环境MacOS Flutter环境配置和安装

一、安装和运行Flutter的系统环境要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS磁盘空间:2.8 GB(不包括IDE/tools的磁盘空间)。工具:Flutter使用git进行安装和升级。我们建议安装Xcode,其中包括git&#x…

Linux的进程信号 -- 信号产生,信号保存,信号捕捉,硬件中断,内核态和用户态,可重入函数,volatile,SIGCHLD

目录 1. 认识信号 1.1 信号的定义和基本结论 1.1.1 查看信号 1.2 技术应用角度的信号 1.2.1 一个样例 1.2.2 系统调用 signal 函数 1.3 信号的处理 2. 信号的产生 2.1 通过终端按键产生信号 2.1.1 基本操作 2.1.2 理解操作系统如何得知键盘信号 2.1.3 初步理解信号…

知识库中嵌入模型(Embedding Models)与重排序模型(Re-ranking Models)推荐工具与库

一、引言 在当今信息爆炸的时代,企业和组织面对海量数据时,如何快速、准确地检索和利用知识成为一项关键技术。知识库作为信息管理和知识发现的核心平台,已经广泛应用于搜索引擎、问答系统、智能客服、推荐系统等领域。然而,传统…