Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用static_cast、C 样式转换或函数样式转换执行。
比如:
const int aa = 10;
//int bb = const_cast<int>(aa);错误
int bb = int(aa);//传统的c转化方式
int bb = static_cast<int>(aa);//static_cast也可以
如果是指针使用就有一个返回的对象要是一个指针,结果指针是指向原指针的,但是不可以认为原来的指针性质已经变化了,依旧不可以直接改变他的值,但是可以通过结果指针改变,引用一样:
int p = 20;
const int *pp = &p;
int *ppp = const_cast<int *>(pp);
*ppp = 30;
//*pp = 40;错误,但是可以通过PPP来改变pp的值
cout << *pp << p <<endl; //3030
对于引用也存在这个问题:
int c = 10;
const int &a = c;
int &b = const_cast<int &>(a);
cout << a << b << c <<endl;//101010
//a = 12;
b = 12;
cout << a << b << c <<endl;//121212
记住一点,就是cast<>的尖括号里面的一定要是对应的如果本身是指针就用指针,是引用就要用引用。
可以看到上面的b可以改变a乃至c的值,但是不能通过a来改变,因为a仍旧常量。
还要注意一个问题就是返回的值不是传给引用,还是可以成功的,相当于转化后的值产生了一个临时中间值,传给了结果值!如下:
int c = 10;
const int &a = c;
int b = const_cast<int &>(a); //临时变量出现
cout << a << b << c <<endl; //101010
//a = 12;
b = 12;
cout << a << b << c <<endl;//101210