const value
经常用于编程。它为程序员提供了安全性,使其价值在未来不会发生变化。不幸的是,这还没有完全执行。因此,它有时会导致很难破译的细微错误。举个例子:
int a = 1;
const int& b = a; // I promise I will not change
a = 3; // I am a liar, I am now 3
cout << b; // As I will now show 3
也可以通过其他方式更改const
值;其中一些非常复杂,需要大量代码,这些代码经常会在其他代码段中丢失,从而导致错误。
那么有人会详细说明改变const value
的可能方法吗?不要担心,如果你不知道所有,很多人不会(包括我自己)。告诉你所知道的所有方法 - 毕竟你只能给你所拥有的东西!
答案 0 :(得分:9)
const int& b = a; // I only promise I will not change the value via b, nothing more.
const
并不保证其他参考或指针不会更改该值。想一想以下代码:
void f(const int& b) { ... }
...
int a = ...;
f(a);
a = ...;
a
的值不会在f()
内(通过传递的参数)更改,这是所有保证。
const
只是一个帮手。如果你不能改变某事,那就把它变成const
,那么编译器会帮助你检查它。您仍然可以通过代码显示的其他方式更改原始值,最终仍然是您的责任。
答案 1 :(得分:2)
是的,const_cast可用于删除'const'关键字的效果(但并非总是如此)。例如:
int a= 1;
const int& b = a;
a = 3;
std::cout<<b<<std::endl;
const_cast<int&>(b) = 4;
std::cout<<b<<std::endl;
答案 2 :(得分:2)
table_beautifier
答案 3 :(得分:1)
您必须首先使用const
variable
作为pointer
然后使用const_cast<data-type>()
语句,如下所示:
使用namespace std;
int main()
{
const int *i = new int(0);
int *n = const_cast<int*>(i);
*n = 10;
cout << *n << endl << *i << endl;
return 0;
}
输出将是:
10
10
答案 4 :(得分:1)
如果不导致未定义的行为,则无法更改const值。
编译器不会试图找出const和非const值之间的差异。它依赖于您,程序员,通过类型系统通知它。 名称是const或非const,编译器对名称强制执行const,而不是值。
有时您似乎可以修改const值,例如当该值具有对其他值的引用并修改THAT时。第一个直觉说这些案例不应该这样做,但是一旦你真正理解并考虑了const-correctness,你会发现它非常一致。
答案 5 :(得分:1)
int k = 0;
const int *l = &k;
cout<<*l; // 0
k=1;
cout<<*l; // 1
这里我只声明一个变量为constant
,即l
。因此,变量l
不能再被更改。我将l
分配给k
;
但现在我可以在任何地方更改k
的值,这将反映在l
中,因为它们共享相同的内存。