1

刚接触 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

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

4

2 回答 2

3

发生这种情况是因为编译器可以假设 const 变量不会改变,因此当您的代码引用它时,编译器假设使用变量值或初始化时的原始值无关紧要,它不应该改变行为,所以它编译成更快的执行,只使用常量1而不参考内存位置。

于 2014-01-05T20:57:10.507 回答
0

如果以常量的形式开始其生命,则使用const_cast<T*>(obj)丢弃常量修改对象是未定义的行为。obj在您的示例中,您告诉编译器j不会更改,编译器只是将所有使用替换j为使用 of 1,而不是。然后,您违反了承诺,编译器生成的代码将不再关注您,而是做自己喜欢的事情。

于 2014-01-05T20:59:13.080 回答