靜態轉換(static_cast)
static_cast全部用於明確定義的變換,包括編譯器允許我們所做的不用強制轉換的“安全”變換和不太安全
但是清楚定義的變換,static_cast包含的轉換類型包括典型的非強制變換,窄化(有信息丟失)變換,使用void*的強制變換,隱式類型變換和類層次的靜態定位。
例如:
- #include<iostream>
- using namespace std;
- int fun(int x){}
- int main()
- {
- int i=0x7fff;
- long l;float f;
- //將int提升到long,float是不會有問題的
- l=i;f=i;
- l=static_cast<long>(i);
- f=static_cast<float>(i);
- //窄化變換,可能會造成信息的丟失
- i=l;i=f;
- char c=static_cast<char>(i);
- void* p=&i;
- float* fp=(float*)p;
- fp=static_cast<float*>(p);
- double d=0.0;
- int x=d;
- x=static_cast<int>(d);
- fun(d);
- fun(static_cast<int>(d));
- return 0;
- }
常量轉換(const_cast)
如果從const轉換為非const或從volatile轉換為非volatile,可以使用const_cast。這是const_cast唯一
允許的轉換,如果進行別的轉換就可能要使用單獨的表達式或者可能會得到一個編譯錯誤。
如果取得了const對象的地址,就可以生成一個指向const的指針,不用轉換時不能將它賦給非
const指針的。
- #include<iostream>
- using namespace std;
- int main()
- {
- const int i=0;
- int* j=(int*)&i;
- j=const_cast<int*>(&i);
- volatile int k=0;
- int* u=const_cast<int*>(&k);
- return 0;
- }