我试图更改一个变量的值,该变量定义为int const,如下所示.
const int w = 10;
int* wp = const_cast <int*> (&w);
*wp = 20;
Run Code Online (Sandbox Code Playgroud)
w的值没有改变,即使在赋值之后仍然是10,尽管它表明w和wp都指向同一个内存位置.但是我可以更改w的值,如果在声明时定义如下
int i = 10;
const int w = i;
Run Code Online (Sandbox Code Playgroud)
如果我改变i的声明使其成为常量
const int i = 10;
Run Code Online (Sandbox Code Playgroud)
w的值不会改变.
在第一种情况下,为什么w的值没有改变,即使w和wp指向相同的内存位置[这是我打印地址时的印象]
与编译器有什么不同,它以不同的方式处理这两种情况?
有没有办法确保w不会失去常数,无论它的定义方式如何?
const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Run Code Online (Sandbox Code Playgroud)
是否可以输出10或20,具体取决于编译器?
据我所知,在C++中,具有相同访问控制的类/成员以声明顺序存储在内存中.是下一个例子m,c应该一个接一个地存储:
#include <cstdlib>
#include <iostream>
struct X
{
mutable int m;
int c;
};
const X cx = {0, 1};
int main()
{
X& x = const_cast<X&>(cx);
x.m = rand();
x.c = rand();
std::cout<<x.m<<" "<<x.c;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,程序运行并打印2个随机数.如果我删除mutable它崩溃,因为cx存储在只读保护的内存中.
这让我很奇怪 - 一个mutable成员是否禁用const整个优化struct(以某种方式使所有成员mutable)?
是否可以将struct只读存储器和其他部件中的部分存储在非只读存储器中并遵守C++标准存储器布局?
这是在Windows 7上使用Visual Studio 2010和在Ubuntu上使用GCC 4.7.2测试的.
可能重复:
C/C++更改const的值
以下程序:
int main()
{
const int x = 10;
int * p = (int *)&x;
*p = 12;
cout<<x<<endl;
cout<<*p<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出一个输出:
10
12
Run Code Online (Sandbox Code Playgroud)
cast&x对(int*)有什么影响?为什么x的值仍为10?我预计它会是12.
另一个疑问
为什么我们不能把int**说成int const**?相反,此操作有效
void f(int const ** p);
void g(int const * const * p);
int main()
{
int ** p = /*....*/
f(p); //Error
g(p); //OK
}
Run Code Online (Sandbox Code Playgroud)
请通过合适的示例帮助我理解这一点谢谢!
在C++中,可以const &改变的价值吗?
好吧,当然不能改变,可以吗?这const意味着什么.而且,听听Stroustrup:
甲
const左值参考指的是恒定的,这是从视角的参照的用户的点不可变的.
但是这个怎么样?
#include <iostream>
int main() {
int a = 0;
const int& r = a;
const int old_r = r;
++a;
const int new_r = r;
std::cout
<< "old_r == " << old_r
<< " but new_r == " << new_r << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这输出,old_r == 0 but new_r == 1.
这是我真正的问题.在上面的代码中,查看该行
const int new_r = r;
Run Code Online (Sandbox Code Playgroud)
只要
&new_r既不在此行也不在代码的其他地方提取volatile,没有任何东西阻止优化编译器从合并old_r …