类型转换有 c 风格的,当然还有 c++风格的。c 风格的转换的格式很简单(TYPE) EXPRESSION,但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的 指针,这两种转换之间的差别是巨大的,但是传统的 c 语言风格的类型转换没有区分这 些。还有一个缺点就是,c 风格的转换不容易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大堆。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。
static_cast | 静态类型转换。 |
---|
reinterpreter_cast | 重新解释类型转换。 |
dynamic_cast | 子类和父类之间的多态类型转换。 |
const_cast | 去掉const属性转换 |
1. static_cast 静态类型转换
- static_cast<目标类型>(标识符)
- 所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种。
#include <iostream>
using namespace std;
int main(void)
{
double dPi = 3.1415926;
int num1 = (int)dPi; //c语言的旧式类型转换
int num2 = dPi; //隐式类型转换
// 静态的类型转换:
// 在编译的时 进⾏行基本类型的转换 能替代c⻛风格的类型转换 可以进⾏行⼀一部分检查
int num3 = static_cast<int> (dPi); //c++的新式的类型转换运算符
cout << "num1:" << num1 << " num2:" << num2 << " num3:" << num3 << endl;
return 0;
}
2. dynamic_cast 子类与父类之间的多态类型准换
- dynamic_cast<目标类型>(标识符)
- 用于多态中父子类之间的多态转换
#include<iostream>
class Animal {
public:
virtual void cry() = 0;
};
class Dog : public Animal
{
public:
virtual void cry()
{
std::cout << "旺旺" << std::endl;
}
void dohome()
{
std::cout << "看家" << std::endl;
}
};
class Cat : public Animal
{
public:
virtual void cry()
{
std::cout << "喵喵" << std::endl;
}
void dohome()
{
std::cout << "抓老鼠" << std::endl;
}
};
int main()
{
Animal* base = NULL;
base = new Cat();
base->cry();
//⽤用于将⽗父类指针转换成⼦子类,
Dog *pDog = dynamic_cast<Dog*>(base); //此时转换时失败的,因为父类指针现在指向的对象是猫,所以转换狗是失败的。
//转换失败返回空(NULL)
if (pDog != NULL)
{
pDog->cry();
pDog->dohome();
}
Cat* pCat = dynamic_cast<Cat*>(base); //此时转换成功,成功将父类指针转换成子类指针
if (pCat != NULL)
{
pCat->cry();
pCat->dohome();
}
system("pause");
return 0;
}
3. const_cast 去掉const属性转换
- const_cast<目标类型>(标识符):目标类型只能是指针或者引用
#include<iostream>
class A {
public:
int data;
};
int main()
{
const A a = { 200 };
A a1 = const_cast<A>(a); //错误,const_cast 目标类型只能是引用或者指针
a1.data = 100;
A& a2 = const_cast<A&>(a);
a2.data = 100;
std::cout << a.data << ' ' << a2.data << std::endl;
A* a3 = const_cast<A*>(&a);
a3->data = 100;
std::cout << a.data << ' ' << a3->data << std::endl;
const int x = 3;
int& x1 = const_cast<int&>(x);
x1 = 200;
std::cout << x << ' ' << x1 << std::endl;
int* x2 = const_cast<int*>(&x);
*x2 = 300;
std::cout << x << ' ' << *x2 << std::endl;
system("pause");
return 0;
}
reinterpret_cast 重新解释类型转换
- reinterpret_cast<目标类型>(标识符)
- 数据的二进制重新解释,但是不改变其值。
#include<iostream>
class Animal {
public:
void cry()
{
std::cout << "Animal cry" << std::endl;
}
};
class Book {
public:
void look()
{
std::cout << "Book look " << std::endl;
}
};
int main()
{
Animal* a = new Animal();
a->cry();
Book* b = reinterpret_cast<Book*>(a); //强制类型的转换
b->look();
system("pause");
return 0;
}