C++ 数据类型转换的实现方式
C++ 里的类型转换本质是把一种类型的数值 "转换成" 另一种类型的数值,主要分两大类:自动转换(隐式转换) 和 手动转换(显式转换),就像你换杯子装水 ------ 自动转换是系统帮你找合适的杯子,手动转换是你自己指定用哪个杯子。
1. 自动转换(隐式转换):系统 "偷偷" 帮你转
这种转换是编译器自动完成的,不用你写任何代码,核心原则是 "低精度→高精度"(避免数据丢失),就像把小杯子的水倒进大杯子,不会洒出来。
常见场景:
- 小范围整型转大范围整型:
short→int→long - 整型转浮点型:
int→float→double - 布尔型转整型:
false→0,true→1
代码示例:
cpp
运行
#include <iostream>
using namespace std;
int main() {
// 1. int转double(自动)
int a = 10;
double b = a; // 系统自动把int的10转成double的10.0
cout << "int转double:" << b << endl; // 输出10
// 2. short转int(自动)
short c = 20;
int d = c; // 自动转换,无数据丢失
cout << "short转int:" << d << endl; // 输出20
// 3. 运算时的自动转换(不同类型先统一,再运算)
int e = 5;
double f = 2.5;
double g = e + f; // e先自动转double(5.0),再和2.5相加,结果7.5
cout << "int+double:" << g << endl; // 输出7.5
return 0;
}
输出:
plaintext
int转double:10
short转int:20
int+double:7.5
注意:
自动转换也可能出问题!如果是 "高精度→低精度"(大杯子倒进小杯子),编译器可能会警告,甚至直接丢失数据:
cpp
运行
double h = 3.14159;
int i = h; // 自动截断小数,i变成3,丢失0.14159
cout << "double转int:" << i << endl; // 输出3
2. 手动转换(显式转换):自己指定转换规则
当自动转换满足不了需求(比如要高精度转低精度、或者想明确控制转换行为),就需要手动指定转换方式,主要有两种写法:
(1)C 语言风格的强制转换(简单直接,新手常用)
语法:(目标类型) 变量/数值
cpp
运行
#include <iostream>
using namespace std;
int main() {
// 1. double转int(手动截断小数)
double a = 9.99;
int b = (int)a; // 手动转成int,结果9
cout << "手动转int:" << b << endl; // 输出9
// 2. int转char(按ASCII码转换)
int c = 65;
char d = (char)c; // 65对应ASCII的'A'
cout << "int转char:" << d << endl; // 输出A
return 0;
}
输出:
plaintext
手动转int:9
int转char:A
(2)C++ 风格的类型转换(更安全,推荐)
C++ 提供了 4 个专用的转换关键字,比 C 风格更规范,能明确转换意图,减少错误:
| 关键字 | 用途 | 例子 |
|---|---|---|
static_cast |
普通安全转换(最常用) | int b = static_cast<int>(9.99); |
const_cast |
去除变量的 const 属性 | int* p = const_cast<int*>(&num); |
reinterpret_cast |
二进制层面的强制转换 | char* q = reinterpret_cast<char*>(&x); |
dynamic_cast |
面向对象的多态转换 | (后续学类和继承时用) |
最常用的 static_cast 示例:
cpp
运行
#include <iostream>
using namespace std;
int main() {
double price = 59.9;
// C++风格手动转换,语义更清晰
int price_int = static_cast<int>(price);
cout << "C++风格转换:" << price_int << endl; // 输出59
return 0;
}
3. 特殊场景:字符串与数值的转换
日常开发中常需要把字符串(比如 "123")转成数字,或数字转字符串,这需要用 C++ 的标准库函数:
(1)字符串转数值
cpp
运行
#include <iostream>
#include <string> // 必须包含
using namespace std;
int main() {
string str = "12345";
// 字符串转int
int num1 = stoi(str);
// 字符串转double
double num2 = stod("3.14");
cout << "字符串转int:" << num1 << endl; // 输出12345
cout << "字符串转double:" << num2 << endl; // 输出3.14
return 0;
}
(2)数值转字符串
cpp
运行
#include <iostream>
#include <string>
using namespace std;
int main() {
int a = 666;
double b = 7.89;
// 数字转字符串
string str1 = to_string(a);
string str2 = to_string(b);
cout << "int转字符串:" << str1 << endl; // 输出"666"
cout << "double转字符串:" << str2 << endl; // 输出"7.890000"
return 0;
}
总结
- C++ 类型转换分自动(隐式) 和手动(显式):自动转换是编译器按 "低精度→高精度" 规则来,手动转换需要自己指定;
- 简单场景可用 C 风格
(类型)变量,规范开发推荐 C++ 风格的static_cast; - 转换时要注意数据丢失:高精度转低精度(如 double→int)会截断数据,需谨慎。