一个奇怪的问题
阅读时,看到const_cast可以去掉底层const,于是写了如下测试代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main(){
const int constant = 3;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
cout << constant << endl;
cout << *const_p << endl;
*modifier = 7;
cout << constant << endl;
cout << *const_p << endl;
return 0;
}
输出结果:很奇怪,通过*modidier修改了之前的常量的值,为什么不输出3,3,7,7,constant的值为什么还是3呢?
后来我在最后输出了constant的地址,和modifier,const_p,看看地址是否一样:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main(){
const int constant = 3;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
cout << constant << endl;
cout << *const_p << endl;
*modifier = 7;
cout << constant << endl;
cout << *const_p << endl;
cout << &constant << endl;
cout << const_p << endl;
cout << modifier << endl;
return 0;
}
输出:(只截取了最后三句的输出)
这时,我有点懵了,这是什么奇怪的问题,怎么同一个地址,里面的值还不一样,后来才想起来,这与C++的编译时初始化有关
编译时初始化和运行时初始化
编译时初始化
代码中,我们定义了常量constant,对于常量,C++要求定义的时候必须进行初始化,初始化分为编译时初始化和运行时初始化
代码中的const int constant = 3; 就是编译时初始化,因为在编译阶段就知道constant的值。
对于常量来言,编译时初始化有一个特殊的地方,编译器会用初始化的值去替换常量出现的地方,在我们的代码中,在程序运行之前,constant就被数值3替换了,所以才有了我们之前看到的输出3,3,3,7,而不是输出3,3,7,7
运行时初始化
运行时初始化,就是在运行阶段才能确定用哪个值来初始化变量,比如用函数的返回值来初始化 一个变量。所以我们只需稍微改一下代码,就能看到我们想看的输出了。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int fun(){
return 3;
}
int main(){
const int constant = fun();
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
cout << constant << endl;
cout << *const_p << endl;
*modifier = 7;
cout << constant << endl;
cout << *const_p << endl;
return 0;
}
输出结果:用一个函数fun()的返回值来初始化constant,这时constant的值需要运行时才能确定,不会在编译阶段就被替换,因此就能看到const_cast的作用了。