编译器如何处理 const 函数?

How does compiler treat a const function?

我知道编译器认为函数是常量(按位常量),如果任何语句对对象的状态进行修改,那么编译器会像示例 1 中那样抛出错误。

示例 1:

class Test
{
public:
    int arr[5];
    void change(int j) const
    {
        arr[3]=j;
    }
};
int main()
{
    Test *ptr=new Test;
    ptr->change(3);
}

示例 2: 现在我已经将 arr 声明为 一个数组 一个指针,但是下面的代码似乎已经在一些编译器上工作了——但在我的编译器上却没有。这是否意味着它有 UB?我遇到的一种合理解释提到我们没有直接更改对象,因此这是允许的。如果是这样,那么为什么我的情况是 UB?我正在使用 VS2008。

class Test
{
public:
    int *arr; //arr is an array
    int i;
    void change(int j) const
    {
        arr[3]=j;
    }
};
int main()
{
    Test *ptr=new Test;
    ptr->change(3);
}

首先,int *ptr没有声明ptr为数组。 ptr在这里是一个指针

其次,您的代码表现出未定义行为的原因是您使用了未初始化的指针。

ptr->change(3) 有效 ptr->arr[3] = 3;。但是你不知道 ptr->arr 指向什么,所以你不知道你要把数字 3 写到哪里。也许它会指向一些可以安全覆盖的未使用内存,也许它会指向未分配的内存并在您尝试访问它时立即使您的程序崩溃,或者它可能会覆盖一些重要的东西。

另外:它 编译 的原因是 arr 是 class Test 的一部分,而 *arr 不是't。从 change 里面,你不能改变 arr,但是你可以改变 *arr.