C++程序设计(面向对象进阶)崔毅东 ——第3单元第02节——3Type conversion (类型转换)

本文详细介绍了C++中的类型转换,包括隐式类型转换的风险和显式转换的必要性,强调了编码规范应避免隐式转换。讲解了C风格和C++风格的强制类型转换,并探讨了reinterpret_cast和const_cast的作用。同时,概述了布尔数据类型、列表初始化以及C++中使用static_cast等关键字进行类型转换的概念。
摘要由CSDN通过智能技术生成

Type conversion (类型转换)

编程时,经常会遇到数据类型转换的问题,比如将浮点数转换为整数,或者将一个整数转换为字符串后进一步处理。

1. 类型转换有两种

1.1. 隐式类型转换

由编译器按照数据类型的转换规则自动转换,无需程序员干预。
可能导致数据精度损失,或者转换失败。
应尽量避免使用隐式类型转换

1.2. 显式类型转换(即:强制类型转换)

由程序员用明确的类型转换语法写出类型转换代码。
好处是,程序员知道自己要做什么并且把这个想法明确表达出来。

2. C风格强制类型转换

语法:(type) value

printf("%d", (int) 2.5);

3. C++风格强制类型转换

语法:static_cast<type> value

 

cout << static_cast<double>(1) / 2;

cout << 1 / 2;

 

 
问题:下面代码的输出是什么?

cout << static_cast<double>(1 / 2);

 

4. 编码规范

  1. Type conversions must always be done explicitly. Never rely on implicit type conversion.

  2. 类型转换必须显式声明。永远不要依赖隐式类型转换

例如:floatValue = static_cast(intValue); // NOT: floatValue = intValue;

5.代码示例

#include <iostream>
int main() {
	int x{ 1 };
	std::cout << x << std::endl;

	//强制类型转换
	std::cout << 1 / 2 << std:: endl;
	std::cout << static_cast<double>(1) / 2 << std::endl;
	std::cout << static_cast<double>(1/ 2 )<< std::endl;
	std::cout << 1.0f / 2.f << std::endl;
	std::cin.get();
	return 0;
}

输出

1
0
0.5
0
0.5

讨论:Unit03-reinterpret_cast和const_cast有什么用?

https://www.cnblogs.com/cdp1591652208/p/7084296.html
const_cast

作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间

如:

#include<iostream>
#include<typeinfo>
 
using namespace std;
 
int main()
{
    const int* pci=0;
    int* pj=const_cast<int*>(pci);//相当于隐式转换int* pj=(int*)pci;
     
    return 0;
}

reinterpret_cast

作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换

如:

#include<iostream>
#include<typeinfo>
 
using namespace std;
 
int main()
{
    //基本类型指针变换
    double d=9.3;
    double* pd=&d;
    int *pi=reinterpret_cast<int *>(pd);
     
    //不相关的类的指针的类型转换 
    class A{}; 
    class B{};
    A* pa=new A;
    B* pb=reinterpret_cast<B*>(pa);//相当于隐式转换B* pb=(B*)pa; 
     
    //指针转换成整数
    long j=reinterpret_cast<long>(pi);//相当于隐式转换long j=(long)pi; 
     
    return 0;
}

总结

本小节介绍3个知识点:

布尔数据类型

C++11新引入的变量/数组/对象的初始化方法:列表初始化

类型转换以及C++的关键字 static_cast

一、布尔数据类型

定义布尔数据类型的关键字是 bool

布尔类型的数据只有两个取值:true 和 false

二、列表初始化

列表初始化是使用大括号对变量等实体进行初始化。

例如

int x = { 4 };
int y { 2 };
char s[] = { 'H', 'i' };

三、C++的类型转换

在C++中,应尽量避免编译器的隐式类型转换,而明确地使用显式类型转换。

C++引入了几个类型转换的关键字:static_cast、dynamic_cast、reinterpret_cast、const_cast。

如果要在原生数据类型(也称为基础数据类型)之间进行转换,则使用static_cast关键字。

例如

double x = 3.01;
int y = static_cast<int>(x);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值