编译器如何处理常量函数
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
是指针。
其次,代码表现出未定义行为的原因是使用了未初始化的指针。
CCD_ 5有效地完成了CCD_ 6。但你不知道ptr->arr
指向什么,所以你不知道把数字3写在哪里。也许它会指向一些可以安全覆盖的未使用内存,也许它会指未分配的内存,并在你试图访问它时使程序崩溃,或者它会覆盖一些重要的内容。
另外:它编译的原因是,虽然arr
是类Test
的一部分,但*arr
不是。从change
内部,您不能更改arr
,但您可以更改*arr
。
相关文章:
- 常量函数,当其参数是对文字类型的引用时
- 为什么在C++使用常量函数时常量是多余的?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么在PIMPL中无法访问实现类的常量函数?
- 常量函数参数的专业化
- 如何调用非常量函数而不是常量函数?
- 常量和非常量函数作为模板参数参数
- 通过引用常量函数调用另一个类的非常量函数
- C++编译器如何检测非常量函数体
- 使用常量函数返回常量引用时出现奇怪的行为
- 常量字符数组模板与字符常量* 函数重载
- 现代C++编译器是否能够避免在某些条件下两次调用常量函数
- 将函数声明为 GCC 纯函数或常量函数的效果(当它不是时)
- 为什么常量/非常量函数重载的继承不明确
- 类型定义模板,接受指向常量和非常量函数的指针
- 如何避免语法相同的常量和非常量函数之间代码重复,这些函数在语义上不相同
- 继承的常量函数
- 不确定 c++ 中的常量函数是什么
- 在常量函数中使用安全的非常量函数
- c++如何定义其他开发人员需要调用的常量函数顺序