2016-06-08 228 views
7

const value经常用于编程。它为程序员提供了安全性,将来价值不会改变。不幸的是,这并没有完全实施。因此,它有时会导致很难破译的微小错误。作为一个例子:在C++中改变常量值的方法

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

+8

'a = 3'不是谎言,因为'a'是非常量。 'const_cast (b)= 3;'会是个谎言。 –

+8

'b'不承诺价值不会改变。强制执行的是你不能直接使用'const'引用来改变值。我认为这是一个有趣的问题,但是你的例子绝对不是最好的 – user463035818

+2

,但不是这个例子假,因为如果你做了'b = 3',你使'b' const不是'a',那么它将失败编译 – EdChum

回答

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

必须先使用constvariable作为pointer的再使用const_cast<data-type>()语句,像波纹管:使用命名空间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 
1

这是不可能改变常量的值,而不会导致未定义的行为。

编译器不会试图找出const和非const值之间的区别。它依靠你,程序员,通过类型系统来通知它。 名称是常量或非常量,编译器在名称上强制执行常量,而不是值。

有些时候,你可以修改一个const值,比如当这个值有一个其他值的引用并修改THAT。第一直觉说这些情况不应该以这种方式表现,但是一旦你真正理解并考虑了常量正确性,你会发现它是非常一致的。

2
int a=1; 
    const int *b=&a; 
    a=3; 
    cout<<(*b); 
    return 0; 
1
int k = 0; 
const int *l = &k; 
cout<<*l; // 0 
k=1; 
cout<<*l; // 1 

在这里,我声明只有一个变量作为constantl。所以变量l不能再改变。并且我将l分配给k的地址;

但是现在我可以在任何地方更改k的值,并且这将反映在l中,因为它们共享相同的内存。