【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日
    浏览(24)
  • c++面试——强制类型转换

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

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

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

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

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

    2024年02月07日
    浏览(56)
  • 【C++】C++的四种类型转换

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

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

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

    2024年01月25日
    浏览(34)
  • 【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日
    浏览(26)
  • C语言(强制类型转换)

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

    2024年02月16日
    浏览(27)
  • Python的强制类型转换

            如果想像C语言那样,在Python中,字节数组(bytes)可以通过标准库中的 struct 模块来进行解包(unpack)成为一个结构体,也可以将一个结构体打包(pack)成为一个字节数组。这个过程类似于C语言中的强制类型转换,但并不是完全相同的概念。 struct 模块提供了一些

    2023年04月08日
    浏览(30)
  • 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日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包