我明白,一个功能被认为由编译器是恒定的(二进制位常量性),并且如果任何陈述的对象的状态带来修改然后编译器会引发错误如实施例1中编译器如何处理const函数?
实施例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 \ * arr; // arr是***不是***数组 – immibis
而在给出的代码中,它不仅仅是一个数组,它甚至不是一个可用的指针;我相信它最终会默认初始化为'nullptr'(甚至可以算作POD类型,内存不初始化?)。所以它肯定是坏的。 – ShadowRanger
@ ShadowRanger它将被初始化。 – immibis