1. C****语言中的类型转换
- 隐式 类型转换: 具有相近的类型才能进行互相转换,如:int,char,double都表示数值。
- 强制类型转换:能隐式类型转换就能强制类型转换,隐式类型之间的转换类型强相关,强制类型转换之间类型关联没有那么大,如:整形和指针,指针与指针。
cpp
int main()
{
int a = 0;
// 隐身类型转换
char b = a;
int c = b + a;
// 强制类型转换
double* d = (double*)a;
double* p = new double;
int* h = (int*)p;
return 0;
}
3.缺点:转换的可视性比较差,所有的转换形式都是一样的,不好排查错误。
**2. C++**支持的类型转换
-
兼容C语言的所有转换。
-
支持内置类型转自定义类型,如:单/多参数的构造函数支持隐式类型转换。
-
支持自定义类型转内置类型,
-
支持自定义类型转自定义类型
cpp
class A
{
public:
A() {}
A(int i) {}
// explicit 可以不让隐式类型转换
// explicit A(int i, int j) {}
A(int i, int j) {}
// 自定义类型转内置类型
operator int()
{
_code = 10;
return _code;
}
int _code;
};
class B
{
public:
B(const A& a) {}
};
int main()
{
// C++98 单参数构造
A a1 = 1;
// C++11 多参数构造
A a2 = { 1,2 };
// 自定义类型转内置类型
int k = (int)a1;
// 自定义类型转自定义类型
B b = a1;
return 0;
}
3. C++4种强制类型转换(标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符)
1. static_cast(隐式类型转换)
**2.**reinterpret_cast(强制类型转换)
cpp
int main()
{
int a = 0;
// 隐身类型转换
char b = static_cast<int>(a);
int c = static_cast<int>(b) + a;
// 强制类型转换
double* d = reinterpret_cast<double*>(a);
double* p = new double;
int* h = reinterpret_cast<int*>(p);
return 0;
}
3. const_cast(删除变量的const属性)
cpp
int main()
{
const int i = 1;
int* p = const_cast<int*>(&i);
(*p)++;
cout << *p << endl;
cout << i << endl;
return 0;
}
虽然 i 是const修饰的,但i本身还是在栈区,只是属性是const(常变量),可以用强制转换成指针
但打印出来的结果不对劲,因为被const修饰了,编译器默认他不会修改,直接放到寄存器里,下次取数据直接拿寄存器里面的,不会到内存里拿。
加上volatile关键字让编译器去内存里取数据
4. dynamic_cast(用于将一个父类对象的指针**/引用转换为子类对象的指针或引用(动态转换))**
1. 只能用于父类含有虚函数的类。
2. 会先检查是否能转换成功,能成功则转换,不能则返回 0。
dynamic_cast 则会检查能否转换成功,指向子类成功,指向父类失败