函数声明末尾的“const”是什么意思? [复制]

2024-01-08

我有一本书,里面写着这样的话:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

这是什么意思?


一个“const 函数”,用关键字表示const在函数声明之后,如果该类函数更改该类的数据成员,则会出现编译器错误。但是,在函数内部读取类变量是可以的,但在该函数内部写入会产生编译器错误。

思考这种“const 函数”的另一种方式是将类函数视为采用隐式函数的普通函数。this指针。那么一个方法int Foo::Bar(int random_arg)(末尾没有 const )会产生类似的函数int Foo_Bar(Foo* this, int random_arg),以及诸如Foo f; f.Bar(4)将在内部对应于类似的东西Foo f; Foo_Bar(&f, 4)。现在在末尾添加 const (int Foo::Bar(int random_arg) const) 则可以理解为带有 const this 指针的声明:int Foo_Bar(const Foo* this, int random_arg)。由于类型为this在这种情况下是 const,无法修改数据成员。

可以放宽不允许函数写入类的任何变量的“const 函数”限制。为了允许某些变量即使在函数被标记为“const function”时也可写,这些类变量用关键字标记mutable。因此,如果一个类变量被标记为可变的,并且“const 函数”写入该变量,那么代码将干净地编译并且该变量可以更改。 (C++11)

和往常一样,处理问题时const关键字,更改 C++ 语句中 const 关键字的位置具有完全不同的含义。上面的用法是const仅在添加时适用const到括号后的函数声明末尾。

const是 C++ 中过度使用的限定符:与指针结合使用时,语法和排序通常并不简单。一些有关的读物const正确性和const关键词:

常量正确性 http://en.wikipedia.org/wiki/Const-correctness

C++“const”声明:为什么以及如何 http://duramecho.com/ComputerInformation/WhyHowCppConst.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数声明末尾的“const”是什么意思? [复制] 的相关文章

随机推荐

  • Django:为每个请求/表单生成新的 CSRF 令牌

    我们是否可以更改每个表单请求甚至每个请求的 CSRF 令牌 而不是一个活动会话的相同令牌 假设您有权访问request object from django middleware csrf import rotate token rotat
  • 获取特定类的所有对象

    我必须通过引用列出作为类实例的对象 class Foo class Foo1 obj1 new Foo obj2 new Foo obj32 new Foo1 我需要一个解决方案来获取 Foo 类实例的所有对象 你知道怎么做吗 获取类的所有
  • 无法使用 Appium 移动 Android SeekBar

    我有一个像这样的定制Android搜索栏 以及它可以移动到的位置 它从中间开始 我想先移动滑块 然后检查它是否已保存 我有一个使用 TouchAction 的方法 public void moveSeekBar WebElement see
  • 二叉搜索树相对于哈希表的优点

    二叉搜索树相对于哈希表有哪些优点 哈希表可以在 Theta 1 时间内查找任何元素 并且添加元素也同样容易 但我不确定相反的优势 没有人指出的一项优点是二叉搜索树允许您有效地进行范围搜索 为了说明我的想法 我想举一个极端的例子 假设你想要获
  • 在 Xml 映射中使用 Hibernate 设置创建和更新时间

    我正在使用 HibernateXml映射 我有一个有两个字段的实体创建日期 and 更新日期类型的timestamp 当实体被持久化和更新时 必须用当前的 UTC 时间填充 我知道 的存在 PrePersist and PreUpdate注
  • CMU Sphinx 4 - 5 pre alpha 安装指南

    CMU Sphinx 4 5prealpha 最新版本 有好的 最好是分步安装指南吗 我找不到任何内容 而且官方指南已经过时了 我一直在尝试按照这些步骤操作 但完成后我缺少 2 个 jar jsapi 和标签 如果我尝试从 eclipse
  • 如何使用脚本化管道方法在参数化构建中定义标签参数

    我正在尝试解决与此问题相同的问题 如何使用管道插件在特定节点上触发詹金斯构建 https stackoverflow com questions 38240943 how to trigger a jenkins build on spec
  • Neo4j中如何找到跳数最少的最短路径?

    我正在建模一个图表 其中节点是位置 边缘表示您可以从一个地方到达另一个地方 这是拥有从一个地方到另一个地方可以采取的所有路线 并且您可以通过不同的路线从一个地方到达另一个地方 因此我想要一个查询 该查询可以返回路线变化最少的最短路径 比如我
  • 获取应用程序的Django版本

    我正在开始一个新的 实际上非 常旧的 项目 我知道它是在 Django 中的 我不知道它所构建的 Django 的确切版本 有没有办法知道我的应用程序正在运行的 Django 版本 唯一的方法就是猜测 我首先查看 settings py 文
  • 通过javascript获取SVG图形的大小

    要在 html 页面中添加 svg 图形 通常使用对象标签将其包裹起来 如下所示 this browser is not able to show SVG a href http getfirefox com http getfirefox
  • 如何调用工厂服务中定义的ng-click函数

    如何调用 ng click 中定义的工厂服务中的函数 app factory MyFactory function return setTest function test alert test app controller TestCtr
  • UserManager.FindAsync(用户名,密码)在 ASP.NET 5 / Identity 3 中不可用

    我正在尝试将项目升级到 ASP NET 5 MVC 6 AspNet Identity 附带的 UserManager 曾经有一个 FindAsync 方法 我可以在其中传递用户名和密码 它似乎不再存在了 我认为我不需要 SigninMan
  • Wildfly 8.2 中的 Kerberos sql server 数据源

    我在 Wildfly 8 2 0 上设置针对 MS Sql Server 的 Kerberos 集成身份验证时遇到问题 这是我到目前为止所做的 设法在 Wildfly 9 0 2 上运行它 只是因为 Wildfly 9 包含 新 登录模块类
  • 如何在此代码中向表格单元格添加点击事件?

    在此代码中 我想使用 JavaScript 使表格单元格可单击 还请告诉我如何在点击事件中使用 i j 值
  • 为什么画布与 onDraw 中视图的大小不同? (安卓)

    我尝试过这个 Override protected void onDraw Canvas canvas Log e TEST canvas width canvas getWidth Log e TEST view width this g
  • 如何向 DT:datatable() 添加标题?

    我经常交换使用knitr kable and DT datatable在我的报告中显示表格 具体取决于数据有多少行 我需要这些表格是数字 以便可以在文档中引用它们 问题是以下代码不会生成第一个表格的表格标题和参考 我必须使用奇怪的解决方法
  • 在 C# 中访问另一个类的方法

    我的 Classes 文件中有许多类 我希望它们都能够访问相同的全局方法来保存重复的代码 问题是 我似乎无法访问文件中另一个类的方法 有什么想法吗 所以我的 class1 cs 布局与此类似 public class Job1 public
  • SQLite,检查TEXT字段中是否有字母字符

    好的 我有一个巨大的条目列表 并且在其中一列中 为简单起见 我们将其称为num有一个数字 比如123456780000 它们的长度和格式都相同 但有时有些字段看起来像这样 12345678E000 or 12345678H000 现在 我需
  • 从 Spring Websocket 程序发送 STOMP ERROR

    我有一个接受 SUBSCRIBE 请求的 Spring Websocket Stomp 应用程序 在应用程序中 我有一个 SUBSCRIBE 处理程序 即 Component public class SubscribeStompEvent
  • 函数声明末尾的“const”是什么意思? [复制]

    这个问题在这里已经有答案了 我有一本书 里面写着这样的话 class Foo public int Bar int random arg const code 这是什么意思 一个 const 函数 用关键字表示const在函数声明之后 如果