1.1静态类型转换主要用于两种转换环境
1.1.1 C++内置类型的转换:与C风格强转类似。
与c相同的地方:
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream>
usingnamespacestd;
intmain()
{
doublea=3.14;
cout <<static_cast<int>(a) << endl;
return0;
}
|
不同的地方就是使用static_cast不能强转内置类型指针的,这点可以避免C风格中的越界问题。
如图所示:
![]()
1.1.2当有继承关系存在时的强转:
如果使用static_cast 由子类向父类转型,向上转型,天然安全安全。(应为子类的空间肯定比父类的空间大,子类是在继承父类的空间上面开辟),代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream>
usingnamespacestd;
classA
{
public:
inta=100;
voidAshow_info()
{
cout<<this->a<<endl;
}
};
classB:publicA
{
public:
inta=200;
intb=300;
intc=400;
voidBshow_info()
{
cout<<this->a<<this->b<<this->c<<endl;
}
};
intmain()
{
B* a=newB;
static_cast<A*>(a)->Ashow_info();
return0;
}
|
结果图:
![]()
我们可以通过子类安全的访问到父类中的a值。
如果使用static_cast 由父类向子类转型,向下转型,是不安全。
那么何时不安全?何时安全?
不安全的情况介绍:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream>
usingnamespacestd;
classA
{
public:
inta=100;
voidAshow_info()
{
cout<<this->a<<endl;
}
};
classB:publicA
{
public:
inta=200;
intb=300;
intc=400;
voidBshow_info()
{
cout<<this->a<<this->b<<this->c<<endl;
}
};
intmain()
{
A* a=newA;
static_cast<B*>(a)->Bshow_info();
return0;
}
|
结果图:
![]()
如图所示结果中并没有出现本应该打出的200,300,400,这就是不知道子类空间是否被开辟而向下访问造成的结果。
安全的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream>
usingnamespacestd;
classA
{
public:
inta=100;
voidAshow_info()
{
cout<<this->a<<endl;
}
};
classB:publicA
{
public:
inta=200;
intb=300;
intc=400;
voidBshow_info()
{
cout<<this->a<<this->b<<this->c<<endl;
}
};
intmain()
{
A* a=newB;
static_cast<B*>(a)->Bshow_info();
return0;
}
|
结果图:
![]()
如图所示,此时我们可以打出200,300,400,等数值,说明当我们知道子类空间被开辟时候,就可以安全的向下访问。