C++ 的类型转换详解

 更新时间:2021年11月01日 10:35:32   作者:ALL IN C  
本篇文章是对C++ 类型转换的详细介绍,需要的朋友参考下,小编觉得这篇文章写的不错,希望能够给你带来帮助

一、C++ 类型转换

1.静态类型转换

1.语法格式

static_cast<目标类型> (标识符)

2.转化规则

在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换。

int a = 10;
int b = 3;
cout<<static_cast<float>(a)/b<<endl; //float = int int = float
return 0;
int *p; void *q;
p = static_cast<int*>(q);
char *p = static_cast<char*>(malloc(100));

2.重解释类型转换

1.语法格式

reinterpret_cast<目标类型> (标识符)

2.转化规则

将数据以二进制存在形式的重新解释,在双方向上都不可以隐式类型转换的,则需要重解释类型转换

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	int x = 0x12345648;
	char *p = reinterpret_cast<char*>(&x);
	//char*p = static_cast<char*>(&x); error
	printf("%x\n",*p);
	int a[5] = {1,2,3,4,5};
	int *q = reinterpret_cast<int*>(a+1);
	printf("%x\n",*q);
	return 0;
}

输出结果

3.常类型转换

1.语法格式

const_cast<目标类型> (标识符) //目标类类型只能是指针或引用。

2.语法规则

用来移除对象的常量性使用 const_cast 去除 const 限定的,目的不是为了修改它的内容,使用 const_cast 去除 const 限定,通常是为了函数能够接受这个实际参数。

#include <iostream>
using namespace std;
void func(int & ref) //别人己经写好的程序或类库
{
	cout<<ref<<endl;
}
int main(void)
{
	const int m = 1;
	func(const_cast<int&>(m));
	return 0;
}

脱掉const后的引用或指针可以改吗

#include <iostream>
using namespace std;
int main()
{
	const int x = 200;
	int & a =const_cast<int&>(x); // int &a = x;
	a = 300;
	cout<<a<<x<<endl;
	cout<<&a<<"---"<<&x<<endl;
	int *p =const_cast<int*>(&x); // int *p = &x;
	*p = 400;
	cout<<a<<*p<<endl;
	cout<<p<<"---"<<&x<<endl;
	struct A
	{
		int data;
	};
	const A xx = {1111};
	A &a1 = const_cast< A&>(xx);
	a1.data = 222;
	cout<<a1.data<<xx.data<<endl;
	A *p1 = const_cast<A*>(&xx);
	p1->data = 333;
	cout<<p1->data<<xx.data<<endl;
	return 0;
}

输出结果

结论:可以改变 const 自定义类的成员变量,但是对于内置数据类型,却表现未定义行为

3.const 常变量(补充)

C++中 const 定义的变量称为常变量。变量的形式,常量的作用,用作常量,常用于取代#define 宏常量

4.动态类型转换

1.语法格式

dynamic_cast<目标类型> (标识符)

用于多态中的父子类之间的强制转化

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 简单说说STL的内存管理

    简单说说STL的内存管理

    <STL 源码剖析>将其描述为空间配置器,理由是allocator可以将其它存储介质(例如硬盘)做为stl 容器的存储空间。由于内存是allocator管理的主要部分,因此,本文以STL内存管理为出发点介绍allocator
    2013-09-09
  • Qt 添加MSVC2017编译器的完整教程(保姆级)

    Qt 添加MSVC2017编译器的完整教程(保姆级)

    本文主要介绍了Qt 添加MSVC2017编译器的完整教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    这篇文章主要介绍了C++ 基本数据类型中int、long等整数类型取值范围及原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Qt编写提示进度条的实现示例

    Qt编写提示进度条的实现示例

    进度条在很地方都可以使用到,Qt自带的进度条或者操作系统的进度条样式,不够炫,本文就介绍一下Qt编写自定义控件的提示进度条的实现示例,感兴趣的可以了解一下
    2021-12-12
  • C语言一篇精通链表的各种操作

    C语言一篇精通链表的各种操作

    链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构,是根据需要开辟内存单元,链表这种数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址
    2022-04-04
  • C语言 二叉树的链式存储实例

    C语言 二叉树的链式存储实例

    本篇文章主要介绍C语言中二叉树的链式存储,这里提供了一个实例代码进行参考,这样对二叉树的链式存储有更深入的了解,希望能帮到学习这块知识的同学
    2016-07-07
  • 如何在C++中调用python代码你知道吗

    如何在C++中调用python代码你知道吗

    这篇文章主要为大家介绍了C++中调用python代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 实现C语言常用字符串库函数

    实现C语言常用字符串库函数

    这篇文章主要为大家介绍了如何实现C语言常用字符串库函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 一个string类的简单实现案例

    一个string类的简单实现案例

    下面小编就为大家带来一篇一个string类的简单实现案例。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    这篇文章主要介绍了C语言字符串处理函数、sizeof、动态内存分配函数、main函数参数问题,static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07

最新评论