目标类型 变量 = static_cast<目标类型>(源对象)
使用场合:
如果源对象和目标类型对象任何一方可以进行隐式类型转换,那么两边都可以进行静态类型转换
例如:char 可以隐式转换成 int;int* 可以隐式转换成 void*
则:这两者可使用静态类型转换
#include <iostream>
using namespace std;
//C++ 凡事需要进行类型转换其实是程序设计的失误
int main(){
//char -可以隐式转换成-int
char c = 'a';
int a = static_cast<int>(c);//静态类型转换
int b = c;//不建议这样使用
cout << a << endl;
int x = 13423;
c = static_cast<char>(x);
char d = x;
cout << c << ":" << d << endl;
return 0;
}
目标类型 变量 = const_cast<目标类型>(源对象)
使用场合:
去除常对象 或者 常引用的常属性;
源对象必须是 常指针或者常引用
const int x = 10;
int p = const_cast<int>(&x);
int& ra = const_cast<int&>(x);
常指针:
#include <iostream>
using namespace std;
int main(){
const int x = 10;//x不会再变 相当于宏 所有使用x的地方直接用10替换
//int z = const_cast<int>(x);//必须是常指针或常引用
const int *p = &x;
//int *px = &x; //在C++中 const int *类型不能隐式转换成 int*
int *px = const_cast<int*>(&x);//去除指针的常属性
*px = 1000;
cout << x << endl;//10
cout << *px << endl;//1000
cout << &x << endl;
cout << px << endl;
cout << *p << endl;
int y = x;
cout << y << endl;
cout << *(&x) << endl;// 10
//int * const p;
const int *p1 = &x;
cout << *p1 << endl; //1000
return 0;
}
常引用:
#include <iostream>
using namespace std;
void fun(const int& r){
//r = 100;
}
int main(){
int x = 10;
fun(x);
fun(1);
const int &r = 100;//引用常量 常引用 即引用常量的引用
//int& rx = 10;
int &rx = const_cast<int&>(r);
cout << rx << endl;
//r = 119;
rx = 119;
cout << r << endl;
cout << rx << endl;
return 0;
}
目标类型 变量 = reinterpret_cast<目标类型>(源对象)
使用场合:
必须是指针与指针之间进行转换;
或者指针与整数之间进行转换
注意:
void * 与 指针 之间 既可以用 static_cast 也可以用 reinterpret_cast
#include <iostream>
using namespace std;
int main(){
int a = 97;
//char *p = &a;//不能直接转换 不存在隐式类型转换
char *p = reinterpret_cast<char *>(&a);
cout << *p << endl;
void *pv1 = &a;//隐式类型转换 void*和任意指针都可以进行隐式类型转换
void *pv2 = reinterpret_cast<void *>(&a);
void *pv3 = static_cast<void *>(&a);
int *pi1 = reinterpret_cast<int*>(pv1);
cout << *pi1 << endl;
int *pi2 = static_cast<int*>(pv2);
cout << *pi2 << endl;
//double *pd = static_cast<double *>(&a);//int *和double*之间不能隐式转换
double *pc = reinterpret_cast<double *>(&a);
//a = p;//C语言警告 C++报错
a = reinterpret_cast<int>(p);
cout << a << endl;
cout << hex << a << endl;
//int *pa = a;
int *pa = reinterpret_cast<int *>(a);
cout << *pa << endl;
cout << pa << endl;
return 0;
}
目标类型 变量 = dynamic_cast<目标类型>(源对象)
使用场合:
用于父子多态中,父子类型的引用或者指针之间的转换
多态 :父子之间的引用或者指针
#include <iostream>
using namespace std;
class F{
public:
virtual void f(){
cout << "F f()" << endl;
}
};
class S:public F{
public:
double x;
void show(){
cout << "S show()" << endl;
}
void f(){
cout << "S f()" << endl;
}
};
class T:public F{
public:
char y;
void print(int x){
cout << x << endl;
cout << "T print()" << endl;
}
void f(){
cout << "T f()" << endl;
}
};
int main(){
S s;
T t;
F& rs = s;
S& r1 = static_cast<S&>(rs);
//T& r2 = static_cast<T&>(rs);//非常危险 rs引用S对象 通过静态类型转换为T类型
if(typeid(rs) == typeid(T)){
T& r3 = dynamic_cast<T&>(rs);
}
try{
T& r2 = dynamic_cast<T&>(rs);
r2.print(10);//r2是T类型 调用T类型的函数
r2.f();//r2的对象是S类型对象
}catch(exception& e){
cout << "不能进行转换" << endl;
}
F& rt = t;
return 0;
}