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. 编码规范
-
Type conversions must always be done explicitly. Never rely on implicit type conversion.
-
类型转换必须显式声明。永远不要依赖隐式类型转换
例如: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);