在c ++中改变const值的方法

时间:2016-06-08 15:15:14

标签: c++ const

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的可能方法吗?不要担心,如果你不知道所有,很多人不会(包括我自己)。告诉你所知道的所有方法 - 毕竟你只能给你所拥有的东西!

6 个答案:

答案 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;

参考:http://en.cppreference.com/w/cpp/language/const_cast

答案 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中,因为它们共享相同的内存。