编译器如何处理常量函数

How does compiler treat a const function?

本文关键字:常量 函数 处理 何处理 编译器      更新时间:2023-10-16

我知道编译器认为函数是常量(逐位常量),如果任何语句对对象的状态进行了修改,那么编译器将抛出一个错误,如示例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指针

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

CCD_ 5有效地完成了CCD_ 6。但你不知道ptr->arr指向什么,所以你不知道把数字3写在哪里。也许它会指向一些可以安全覆盖的未使用内存,也许它会指未分配的内存,并在你试图访问它时使程序崩溃,或者它会覆盖一些重要的内容。

 

另外:它编译的原因是,虽然arr是类Test的一部分,但*arr不是。从change内部,您不能更改arr,但您可以更改*arr