为什么C++中允许从外部修改常量对象的指针成员变量的内存?

2023-11-24

我一直试图理解,当我在 C++ 中编写一个带有常量参数和该对象内部的指针变量的函数时,const 标志并不能保护底层内存免受修改。 例如,在以下位置执行以下操作是完全合法的operator=()类的函数称为X:

class X
{
public:
    X& operator=(const X& other)
    {
        this->data = other.data; //(*)
        return *this;
    }

private:
    int* data;
};

(*):这与以下内容相同:

int* some_pointer;
int* const other_pointer = some_pointer;
int* class_pointer = other_pointer;

但不等于:

const int* other_pointer; 
int* class_pointer = other_pointer;

这会产生以下错误:

error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
 int* class_pointer = other_pointer;
                      ^

我明白为什么other.x正在被投射到int* const但我不明白为什么它没有被投射到const* int同时(这是一个const int* const)。当我编写一个带有const论证我的逻辑表明该论证中的任何内容都应该继承常量性,因为这应该是const,保护底层数据不被修改。

当从外部访问指针成员时const类的版本我认为应该合理地期望该对象的const关键字应该保护类中的任何内容(甚至内存)不被修改。反对这一点的论点是外部内存不属于该对象,因此它也不应该有责任保护它。我对此的看法是,在这种情况下(在任何其他情况下,当它被其他地方以任何类型的访问权限访问时),我们正在从const目的。换句话说,它让外部事物变得可见。那么不提高知名度的原因是什么const?这不会改变代码任何其他位置的内存的可访问权限!


“当我编写带有 const 参数的函数时,我的逻辑表明该参数内的任何内容都应该继承常量,因为这应该是 const 的目的,以保护底层数据免遭修改。”

你对此说得很对,但是存储在X- 对象点outside物体。外界不受影响X的常量性,只是里面存储的数据X.

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

为什么C++中允许从外部修改常量对象的指针成员变量的内存? 的相关文章

随机推荐

  • 更改 Rails 中的当前选项卡

    我的应用程序顶部有一个选项卡列表 我将其包含在 application html erb 的常规布局中 它们看起来像这样 li class current li li li li li 当我点击该页面时 我想将所选选项卡更改为 当前 选项卡
  • 将数据从活动发送到另一个活动而不启动它

    如果我有两个活动 Activity1 和 Activity2 并且我想在不启动 Activity2 的情况下将数据从 Activity1 发送到 Activity2 我知道如果我想启动 Activity2 我在 Activity1 java
  • 如何为基于 YAML 的管道创建管道变量?

    使用设计器 类构建管道 您可以定义具有要传递到任务中的默认值的管道变量 如何对基于 YAML 的管道执行相同的操作 我想创建三个构建管道 每个管道都有一个设置为不同值的变量 所有三个都指向一个 YAML 文件 这文档 states 您可以选
  • 如何计算两个 Rust 数组/切片/向量的点积?

    我试图找到两个向量的点积 fn main let a vec 1 2 3 4 let b a clone let r a iter zip b iter map x y Some x y gt x y sum println r 这失败了
  • 评估 if 语句中可选对象的 Bool 属性

    我正在寻找一种评估 Swift 的方法Bool简洁地概括为一个if声明 当Bool是可选对象的属性 var objectWithBool ClassWithBool if let obj objectWithBool if obj bool
  • 在 C 中如何将浮点值限制为小数点后仅两位?

    在 C 中如何将浮点值 例如 37 777779 四舍五入到小数点后两位 37 78 如果您只想对数字进行四舍五入以用于输出目的 那么 2f 格式字符串确实是正确的答案 但是 如果您实际上想要舍入浮点值以进行进一步计算 则可以使用如下所示的
  • 如何在没有 ssh 身份验证的情况下设置 git 服务器

    不久前 我偶然发现了关于如何通过 Web 服务器以某种方式设置 git 身份验证的解释 这样客户端就不需要 ssh 密钥交换 真遗憾 我既没有为其链接添加书签 也记不起该技术 我只是怀念抛出一个用户名 密码组合来访问一些一次性存储库 当对一
  • `warm_start` 参数及其对计算时间的影响

    我有一个逻辑回归具有一组定义的参数的模型 warm start True 一如既往 我打电话LogisticRegression fit X train y train 并使用之后的模型来预测新的结果 假设我改变一些参数 比如说 C 100
  • Google 是否正在为 HTML 自定义数据属性建立索引?

    我正在使用 PushState hash bangs 构建一个基于 AJAX 的投资组合模块 并且由于我排除了没有 JavaScript 的浏览器 所以我唯一关心的是 HTML 自定义数据属性在 SEO 方面的限制 例如 使用下面的代码 u
  • 按需显示或隐藏标题栏

    我想向我的 Windows 窗体应用程序 用 vb net 编写 添加一个选项 该选项将为用户提供隐藏菜单栏和标题栏的选项 我可以做菜单 但我不确定隐藏标题的最佳方法是什么 我可以将 FormBorderStyle 更改为 none 但这是
  • Laravel 从数据库加载设置

    我正在寻找一种使用 Laravel 5 从数据库加载设置 配置的有效方法 设置包括key and value列中 模型类基本上如下所示
  • 避免seaborn箱线图中被群图覆盖的重复图例

    在下面基于seaborn的图中 我正在制作一个由群图覆盖的箱形图 两者都是色调的子集 有什么办法可以让它们在图例中不重复两次吗 这是我的代码 ax sns boxplot x name xaxis y name col hue hue da
  • TelephonyManager 对于 IMEI 号码返回 null:什么可能导致此情况?

    我正在开发一个 Android 应用程序 并且正在得到null使用时返回 IMEI 号码TelophonyManager 多款华为手机都出现这种情况 均为 Ascend Y530 这些手机都有 SIM 卡 其他方面似乎都运行正常 我的印象是
  • 如何调试 Rust 中的内存问题?

    我希望这个问题不要太开放 我遇到了 Rust 的内存问题 我得到了通话中出现 内存不足 next on an Iterator特质对象 我不确定如何调试它 印刷品只是把我带到了失败发生的地方 我对其他工具不太熟悉 例如ltrace 所以虽然
  • Spark.python.worker.memory 与 Spark.executor.memory 有何关系?

    这张图对于不同 YARN 和 Spark 内存相关设置之间的关系非常清楚 除了涉及到spark python worker memory 如何spark python worker memory适合这个内存模型吗 Python 进程是否受以
  • Zoho mail 显示 Node Js 中的 535 身份验证失败

    我正在使用 Node Express 和 MongoDB 创建一个应用程序 用户创建成功后 想要发送给用户的邮件 我正在使用 zohomail 并且可以使用这些用户名和密码在线登录 zohomail 但是当我尝试发送邮件时出现错误 code
  • 在 Django 中覆盖外部应用程序的模板

    我想覆盖外部应用程序的模板 allauth 安装在站点包中 不幸的是我读到的建议没有起作用 我将以下内容添加到我的settings py PROJECT ROOT os path normpath os path dirname os pa
  • 在 O(n) 时间内将堆转换为 BST?

    我认为我知道答案并且最小复杂度是O nlogn 但是有什么方法可以让我从堆中创建二叉搜索树O n 复杂 没有算法可以在 O n 时间内从堆构建 BST 原因是给定 n 个元素 您可以在 O n 时间内从它们构建一个堆 如果您有一组值的 BS
  • 有没有办法强制 std::array 完全初始化

    我在用std array
  • 为什么C++中允许从外部修改常量对象的指针成员变量的内存?

    我一直试图理解 当我在 C 中编写一个带有常量参数和该对象内部的指针变量的函数时 const 标志并不能保护底层内存免受修改 例如 在以下位置执行以下操作是完全合法的operator 类的函数称为X class X public X ope