const_cast:相同的地址但不同的值?

时间:2014-01-05 20:43:10

标签: c++ const-cast

C ++新手并学习const_cast - 让下面的代码感到困惑:

int main(){
    const int j = 1;
    int * p = (int *)(&j);
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;
    *p = 2;
    cout << j << ' ' << *p << endl;
    cout << &j << ' ' << p << endl;

    const int k = 1;
    int * q = const_cast<int*>(&k);
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;
    *q = 2;
    cout << k << ' ' << *q << endl;
    cout << &k << ' ' << q << endl;

    return 0;
}

输出

1 1
00A2FD9C 00A2FD9C
1 2
00A2FD9C 00A2FD9C
1 1
00A2FD84 00A2FD84
1 2
00A2FD84 00A2FD84

有谁可以告诉我为什么地址(&amp; i和p,或&amp; j和q)是相同的,但是值(i和* p,或j和* q)是不同的?我正在使用Visual Studio 2013RC。

2 个答案:

答案 0 :(得分:3)

发生这种情况是因为编译器可以假设一个const变量不会改变,因此当你的代码引用它时,编译器会假定使用变量值,或者初始化时的原始值无关紧要,它会打扰'改变行为,因此它编译为执行速度更快,只使用常量1而不引用内存位置。

答案 1 :(得分:0)

如果const_cast<T*>(obj)将其作为常量开始使用,则使用obj去掉const 修改对象是未定义的行为。在您的示例中,您告诉编译器j不会更改,编译器只是将j的所有用法替换为1的使用。然后你打破了承诺,编译器生成的代码将不再关注你了,而是做了它喜欢的事情。