为什么C++"const"函数可以修改其指针类型的成员?

 盖世猎人 发布于 2023-02-13 12:37

我有以下代码由于编译失败 invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]

#include 
#include 

using namespace std;

#define N 3

void f(int *p) 
{
    *p=8;
}

class A
{
    private:
        int a;
    public:
        void init() const;
        void print() const {cout<

这并不奇怪,因为"init"函数的"const"限定符.

但是,以下代码编译并运行顺利,

#include 
#include 

using namespace std;

#define N 3

void f(void **pp)
{
    *pp = new int[N];
}

class A
{
    private:
        int * p;
    public:
        void init() const;
        void assign() {for (size_t i=0; i

问题:在第二种情况下,为什么"const"函数(init)可以修改其成员(p)?

1 个回答
  • 你的C风格的演员正在进行const_cast(除其他事项外),这使你可以获得非const对象的可写视图,即使你拥有的只是一个只读视图.

    但是,如果你不小心,它可能会破坏(导致未定义的行为).考虑:

    const A a;
    int main()
    {
        a.init();
        //a.assign();
        a.print();
    }
    

    如果您的工具链放入a只读内存,那么在运行时可能会失败.

    const在C++中,private不提供安全性.它是类型系统的一部分,并利用编译​​器的类型检查器来帮助您捕获编码错误.但是输入信息总是可以用强制转换覆盖.

    最后,如果你不想意外抛弃const,不要使用C风格的演员表.如果您使用过static_cast或者reinterpret_cast编译器会遇到错误.

    2023-02-13 12:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有