【博客183】C++ "static_cast" 与 "强制转换"

内容: 记录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的同学欢迎私信一起讨论学习。

发布了214 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/104997311