从 const 成员函数返回非常量引用

2023-12-26

为什么返回对指向的成员变量的引用有效,而另一个则无效?我知道一个const成员函数应该只返回const引用,但是为什么对于指针来说这似乎不正确呢?

class MyClass
{
  private:
    int * a;
    int b;
  public:
    MyClass() { a = new int; }
    ~MyClass() { delete a; }

    int & geta(void) const { return *a; } // good?
    int & getb(void) const { return b; }  // obviously bad
};

int main(void)
{
  MyClass m;

  m.geta() = 5;  //works????
  m.getb() = 7;  //doesn't compile

  return 0;
}

int & geta(void) const { return *a; } // good?
int & getb(void) const { return b; }  // obviously bad

在 const 函数中,每个数据成员都变成 const以使其无法修改的方式. int变成const int, int *变成int * const, 等等。

自从type of a在你的第一个函数中变成int * const,相对于const int *,这样您就可以更改数据(可修改):

  m.geta() = 5;  //works, as the data is modifiable

之间的区别:const int* and int * const.

  • const int*表示指针是非常量,但是指针指向的数据是const.
  • int * const表示指针是const,但是指针指向的数据是非常量.

你的第二个函数尝试返回const int &,自从type of b become const int。但是您在代码中提到了实际的返回类型int &,所以这个函数会not甚至编译(参见this http://www.ideone.com/xjE8E),无论你在做什么main(),因为返回type不匹配。这是修复方法:

 const int & getb(void) const { return b; }  

Now it 编译得很好! http://www.ideone.com/J2eLN.

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

从 const 成员函数返回非常量引用 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何引用 Perl 子例程?

    我在弄清楚如何引用外部模块文件中的子例程时遇到了一些麻烦 现在 我正在这样做 外部文件 package settingsGeneral sub printScreen print 0 Main use settingsGeneral my
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 输入字段问题 - 关闭窗口但保持 Python 运行 [重复]

    这个问题在这里已经有答案了 有点长的问题 我正在创建一个输入字段 在 skrx 的主要帮助下 该字段显示在定制屏幕上 我已经对其进行了编程 以便当我按 Enter 键时 屏幕应该自行关闭 目前这个 pygame display quit 感
  • 如何在 TensorFlow 中有效地分配给张量的切片

    我想为 TensorFlow 2 x 中的一个模型中的输入张量切片分配一些值 我正在使用 2 2 但准备接受 2 1 的解决方案 我想做的一个非工作模板是 import tensorflow as tf from tensorflow ke
  • 如何调试通过 Windows Scheduler 运行的 exe? [复制]

    这个问题在这里已经有答案了 我正在使用 Windows Scheduler 来运行我编写的 exe 当调度程序启动我的 exe 时 如何跳入调试会话 更新1 我曾想过执行 Thread Sleep 然后附加到进程 当我尝试时 它说调试器已经
  • 加载 php 模块时出错

    我在 etc php 7 0 cli php ini 中添加了curl模块 extension usr lib php5 20121212 curl so 但是当我重新启动 php 时 我会 php m 我收到此错误 curl Unable
  • 如何在maven2中进行ear build?

    我对maven2很陌生 直到昨天我才成功地从maven2构建了war 我的下一个目标是为 war 文件构建 Ear 文件 其中还包括一些 jar 文件 你能帮忙吗 我将非常感激 问候 咬伤85 的官方文档Maven EAR 插件 http
  • msdeploy 的 Manifest.xml 文件中的 runCommand 提供程序

    我试图通过使用清单文件中的 runCommand 提供程序 通过 msdeploy 将运行批处理脚本 更多 前提是我能弄清楚 作为部署过程的一部分 这就是我的清单文件的样子
  • 如何加速 R 中的“expand.grid()”?

    我正在尝试加快创建包含两个向量之间所有可能组合的表 我们可以从以下位置获取此功能base R当我们使用expand grid 然而 我想知道我们是否可以使用以下工具实现相同的结果 但速度更快 collapse 包裹 StackOverflo
  • 在 PHPUnit (CIUnit) 中使用 YAML 文件作为数据提供者

    我正在使用 PHP CodeIgniter 框架编写一个应用程序 我正在尝试使用 CI Unit 扩展名为 PHPUnit 来测试应用程序 为了测试模型 我尝试加载 PHPUnit 文档中定义的 YAML 数据提供程序 但收到错误 如果我伪
  • Android Studio 不显示按钮的属性

    我在 Android Studio 中打开了一个空白的 Android 应用程序 当我尝试编辑按钮时 属性不存在 我是 Android 开发新手 正在遵循显示如何更改按钮中的文本的指南 但属性菜单缺少指南中看到的选项 Using 安卓工作室
  • API网关集成中使用代理集成有什么用?

    我正在尝试在 API Gateway API 和 VPC 背后的资源之间进行集成 创建集成时 有一个选项可供选择 使用代理集成 即使我没有选中此复选框并部署 API 我也可以通过 NLB 使 API 网关连接到 VPC 中的目标资源 所以
  • 在 php 中执行条件时出现问题[已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 press GET sell echo press OUTPUT IS SELL if press SELL header Loc
  • Android 共享首选项在删除文件后仍然可见

    我正在尝试使用共享首选项的应用程序 当我从中删除首选项文件时数据 data com your package name shared prefs mySharedPref xml手动使用 Android 监视器 应用程序仍然能够读取首选项值
  • DataGridView 级联/相关组合框列

    因此 我时常在 Winforms 的遗留应用程序中工作 并不总是熟悉绑定对象的最佳实践 基本上我有一个三部分集 其中有两个人 他们可能只有一种产品 但该产品可能会导致拥有不同的 SKU 集 有没有办法从第一个组合框的值触发组合框的事件和填充
  • Java EE 中的拦截器是什么?

    我正在尝试澄清关于 Java EE 中的拦截器的概念 我已经阅读了 Java EE 规范 但我对此有点困惑 请为我提供一些有用的链接或教程 以澄清我的概念 我们如何 何时 为何使用拦截器 拦截器用于实现业务逻辑中的横切关注点 例如日志记录
  • 从 activemq 主题获取消息时,logstash 输入速度非常慢

    我已经在logstash中配置了JMS输入来订阅JMS主题消息并将消息推送到弹性搜索 input jms id gt my first jms yaml file gt D softwares logstash 6 4 0 config j
  • 访问派生类中的受保护成员

    我昨天遇到了一个错误 虽然很容易解决 但我想确保我正确理解了 C 我有一个带有受保护成员的基类 class Base protected int b public void DoSomething const Base that b tha
  • 如果我从不将 MutexGuard 分配给变量,那么它在哪里?

    我不明白 哪里 MutexGuard在内部代码块中是 互斥锁被锁定并展开 产生MutexGuard 不知何故 这段代码设法取消引用MutexGuard然后可变地借用该对象 哪里去了MutexGuard去 另外 令人困惑的是 这种取消引用不能
  • usockets:打开套接字时如何指定外部格式

    我正在尝试连接到 mud 客户端 因此我使用 usockets 通过 tcp 连接 但是在我写完之后 我得到了解码错误读数 我有理由相信编码应该为 ascii 或者至少使用 clrf 作为行尾指示符 因为在我读到的行上 行尾之前有一个 M
  • RESTful Web 服务和 HTTP 动词

    服务器应允许将 Web 服务归类为 RESTful 的最小 HTTP 动词集是什么 如果我的主机不允许怎么办PUT and DELETE 这真的很重要吗 我能从此过上幸福的生活吗 GET and POST Update 谢谢各位的解答 罗杰
  • 从 const 成员函数返回非常量引用

    为什么返回对指向的成员变量的引用有效 而另一个则无效 我知道一个const成员函数应该只返回const引用 但是为什么对于指针来说这似乎不正确呢 class MyClass private int a int b public MyClas