【C++】四种强制类型转换

这篇具有很好参考价值的文章主要介绍了【C++】四种强制类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++中有四种强制类型转换: 静态转换:static_cast、动态转换:dynamic_cast、重新解释:reinterpret_cast、常量转换(去常性):const_cast

1.静态转换(static_cast):可以用于基本数据类型之间的转换,也可以将基类指针或引用转换为派生类指针或引用,但是转换时需要保证类型转换是安全的。静态转换不能用于去除对象的const、volatile属性

2.动态转换(dynamic_cast):主要用于将基类指针或引用转换为派生类指针引用,但是转换时需要判断类型转换是否安全,如果不安全则返回空指针。只有指向具有多态性质的类的基类指针或引用才能使用dynamic_cast。

3.重新解释转换(reinterpret_cast):将一个指针或引用转换为一个与其类型无关的指针或引用。这种转换不会进行类型检查,因此很容易引发未定义的行为,应该避免使用。

4.常量转换(const_cast):用于去除一个变量或指针的const、volatile属性。这种转换也需要谨慎使用,因为去除const属性可能会导致未定义的行为。


 static_cast

static_cast<目的类型>(表达式)

1.基本数据类型之间的转换

{
	int a = 5;
	float b = 2.2;
	//printf("%f\n", a);//错误输出
	//printf("%d\n", b);//错误输出
	printf("%f\n", (float)a);
	printf("%d\n", (int)b);
	
	a = static_cast<int>(b);//c++的强转
}

2.枚举类型之间的转换

int main()
{
	enum AA{A = 3,B = 10};
	enum BB{C = 5,D = 30};
	int a = 20;
	enum AA aa = A;
	cout << aa << endl;
	//aa = a;//枚举类型的只能用枚举类型内的赋值
	aa = static_cast<enum AA>(a);
	cout << aa << endl;

	enum BB bb = C;
	aa = static_cast<enum AA>(bb);
}

3.指针类型转换成void*

int main()
{
	int a = 10;
	int* p = nullptr;
	char ch = 'a';
	void* vp = &a;
	p = static_cast<int*>(vp);
	cout << *p << endl;

	//不安全--两边解析的大小不同
	vp = &ch;
	p = static_cast<int*>(vp);
	cout << *p << endl;
}

4.将一个变量转换成常量

        这种不用强转其实也可以

int main()
{
	int a = 20;
	const int ca = a;
	const int cb = static_cast<const int>(a);
	cout << ca << endl;
}

5.基类和派生类之间的转换--没有virtual

class A
{
public:
	void fn() { cout << "A::fn" << endl; }
	void gn() { cout << "A::gn" << endl; }
};
class B :public A
{
public:
	void fn() { cout << "B::fn" << endl; }//隐藏,没有虚
	void hn() { cout << "B::hn" << endl; }
};
int main()
{
	A a;
	B b;
	A* pa = &b;
	pa->fn();//A
	pa->gn();//A
//	B* pb = &a;//error
	B* pb = static_cast<B*>(&a);
	pb->fn();//B
	pb->gn();//A
	pb->hn();//B
	pb->A::fn();//A
}

6.没有关系的类之间的转换

class A
{
public:
	void fn() { cout << "A::fn" << endl; }
};
class B
{
public:
	B(A&a){}//构造函数可以进行强转
	void gn() { cout << "B::gn" << endl; }
};
int main()
{
	A a;
	B b = static_cast<B>(a);//B b(a);
	b.gn();
}

dynamic_cast

        将基类的指针或引用安全的转换为派生类的指针或引用,并用派生类的指针或引用来调用非虚函数。
注意:当使用dynamic_cast时,该类型要包含有虚函数,才能进行转换,否则错误。

class A
{
public:
	void print() { cout << "A::print" << endl; }
	virtual ~A() {};//多态
};
class B :public A
{
public:
	void show() 
	{
		cout << "B::show" << endl;
	}
};
int main()
{
	A* pa = new A;
	B* pb = dynamic_cast<B*>(pa);
	pb->print();
	pb->show();
}

reinterpret_cast

        适用于指针转换为另一种指针,转化不用修改指针变量值数据存储格式,不改变指针变量的值,只需要在编译时重新解释指针的类型即可。也可以将指针,直接转化成整形值。

int main1()
{
	float ff = 3.5f;
	float* pf = &ff;
	int* pi = reinterpret_cast<int*>(pf);//编译时重新解释
	cout << *pi << endl;//取不到正确的值
	cout << *pf << endl;//pf不变

	//整形按二进制补码存
	unsigned int a = -2;//把-2放到a开辟的空间中
	/*
	00000000 00000000 00000000 00000010
	11111111 11111111 11111111 11111110:-2,4294967294
	unsigned无符号位
	*/
	//浮点sem存
}

class A
{

};
class B
{

};
int main()
{
	A* pa = new A;
	B* pb = reinterpret_cast<B*>(pa);
	//B*pb = (B*)pa;
	int a = 10;
	int* pi = &a;
	long j = reinterpret_cast<long>(pi);
	cout << j << endl;//地址值
}

const_cast

static_cast不能移除变量的const属性,const_cast可以,但是就算可以强转了const在数据区的内容也不改变。文章来源地址https://www.toymoban.com/news/detail-463755.html

int main()
{
    const int cb = 10;
    //int* p = &cb;
    //int* p = static_cast<int*>(&cb);//error
    int* p = const_cast<int*>(&cb);//
    *p = 30;
    cout << cb << endl;//cb在字符串常量区,改不了,输出10
}

到了这里,关于【C++】四种强制类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C\C++】C++四种强制转换原理与价值

    static_cast:static_cast 在编译时进行类型检查,如果转换不合法则会产生编译错误。对于基本数据类型之间的转换,static_cast 可以进行常规的类型转换,例如将 int 类型转换为 double 类型。对于具有继承关系的指针或引用之间的转换,static_cast 可以进行向上转换(将派生类指针或

    2023年04月25日
    浏览(33)
  • C++强制类型转换

    static_cast 是 C++ 中的一种显式类型转换运算符。 它可以将一个表达式强制转换为指定的类型,并且是静态类型转换,因此不会执行任何运行时类型检查。如果类型转换不合法,则程序可能出现未定义的行为。因此,使用 static_cast 要特别小心,确保类型转换的合法性。 格式

    2024年02月07日
    浏览(70)
  • C++ 强制类型转换

    在C++中,有四种强制类型转换: 1、 static_cast :这是最常见的类型转换。它可以用于基本数据类型之间的转换,也可以用于指向父类和子类之间的指针或引用的转换。 static_cast可以实现下列转换: ①基本数据类型之间的转换。 ②将任何类型转换为void类型。 ③把空指针转换成

    2024年02月14日
    浏览(41)
  • c++面试——强制类型转换

    方式 说明 示例 static_cast 用于基本类型之间、类继承体系之间的转换 int - double Derived* - Base* const_cast 用于移除变量的const、volatile等属性 const int - int dynamic_cast 用于类继承体系之间的安全向下转换,转换失败返回NULL Derived* - Base* reinterpret_cast 用于不相关类型之间的转换,结果不安

    2023年04月25日
    浏览(42)
  • 【C++】C++的四种类型转换

    当等号两边的类型不同的时候、形参与实参类型不匹配的时候、返回值类型与接收返回值类型不一致时,就需要发生 类型转化 。 而类型转换又 分为隐式类型转换和显示类型转换 。 隐式类型转换是编译器在编译阶段自动进行,能转就转,不能转就编译失败。 而显示类型转换

    2023年04月09日
    浏览(53)
  • 【C++干货铺】C++中的四种类型转换

    ========================================================================= 个人主页点击直达:小白不是程序员 C++系列专栏:C++干货铺 代码仓库:Gitee ========================================================================= 目录 C语言中的类型转换 为什么C++需要四种类型转化 C++强制类型转换 static_cast reinter

    2024年01月25日
    浏览(47)
  • 【036】读懂C++的强制类型转换static_cast、const_cast、dynamic_cast以及reinterpret_cast

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月12日
    浏览(38)
  • C语言强制类型转换

    C语言中的强制类型转换是指将一种数据类型转换为另一种数据类型的过程。强制类型转换可以显式地将一个数值从一种数据类型转换为另一种数据类型,但是需要注意的是,该转换可能会导致数据精度的丢失。下面是C语言中强制类型转换的实际代码示例: 在上述代码示例中

    2024年02月04日
    浏览(45)
  • 4个强制类型转换

    static_cast   静态转换 dynamic_cast  动态转换 const_cast    去常性 reinterpret_cast  重新解释 一、static_cast static_cast目的类型(表达式) 1.基本数据类型之间的转换 2.枚举类型之间的转换 3.指针类型转换成void* 4.将一个变量转换成常量 5.static_cast不能移除变量的const属性 6.基类和派生类

    2024年02月07日
    浏览(39)
  • C语言(强制类型转换)

    创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~ 一.类型转换原则 1.升级:当类型转换出现在表达式时,无论时unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包