内容: 记录C++中的static_cast与强制转换的区别
"static_cast" 与 “强制转换” 的区别一:无关类型的指针之间转换
1.static_cast进行无关类型的指针之间转换:
#include<iostream>
using namespace std;
class A
{
int a;
};
class B
{
int b;
};
class C : public A
{
int c;
};
int main()
{
B* b = new B;
C* c = new C;
A* pA1 = static_cast<A*>(b);
return 0;
}
编译:出错,static_cast无法进行无关类型指针间的转换
#include<iostream>
using namespace std;
class A
{
int a;
};
class B
{
int b;
};
class C : public A
{
int c;
};
int main()
{
B* b = new B;
C* c = new C;
A* pA2 = static_cast<A*>(c);
return 0;
}
编译:正确通过,因为C与A是子类和父类的关系,是相关类型之间指针的转换
2.强制转换:
#include<iostream>
using namespace std;
class A
{
int a;
};
class B
{
int b;
};
class C : public A
{
int c;
};
int main()
{
B* b = new B;
C* c = new C;
A* pA1 = (A*)b;
return 0;
}
编译:正确通过,强制转换可以进行无关类型之间的转换,但是无关类型指针之间的转换即使成功,
基本上使用一个类型的指针去操作另一个类型的数据,这种使用也是不对的。相比强制转换 static_cast提供了对无关类型指针之间的转换的一个错误检测。
"static_cast" 与 “强制转换” 的区别二:无关类型之间转换
1.依靠编译器进行类型转换
#include<iostream>
using namespace std;
int main()
{
int a;
double b = 1;
a = b;
return 0;
}
此时:linux g++不会警告,但是VS会警告你可能丢失数据
2.使用static_cast:则用于表示这个转换是知情的,编译器无须发出警告!
#include<iostream>
using namespace std;
int main()
{
int a;
double b = 1;
a = static_cast<int>(b);
return 0;
}
大四学生一枚,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。有喜欢C/C++,linux的同学欢迎私信一起讨论学习。