C++运算符:类型转换规则
一. 隐式类型转换(自动类型转换)
1. 不同算术类型间的转换
在表达式中,如果不同类型的操作数混合使用,C++会自动进行一些类型转换,通常是将低精度类型转换为高精度类型。例如,在int和double混合的表达式中,int类型会自动转换为double类型。
int num1 = 5; double num2 = 3.14; double result = num1 + num2; // 这里num1会自动转换为double类型(值为5.0),然后进行加法运算
2. 赋值时的类型转换
当把一个表达式的值赋给一个变量时,如果表达式的类型与变量类型不一致,会进行隐式转换。例如,把int类型的值赋给double类型变量是允许的,会自动进行转换。
int num3 = 10; double num4; num4 = num3; // num3的值10被转换为10.0后赋给num4
3. 函数调用时的类型转换
在函数调用过程中,如果实参类型与形参类型不完全匹配,但可以进行隐式转换,那么会自动进行转换。例如,函数形参为double类型,而实参为int类型时。
void printValue(double num) { std::cout << num << std::endl; } int num5 = 7; printValue(num5); // num5会被转换为double类型后传递给printValue函数
4. 转换规则总结
基本的转换顺序是:char、signed char、unsigned char、short、unsigned short类型会转换为int类型;如果int类型不足以表示所有的值(例如unsigned short的值范围大于int的正值范围),则转换为unsigned int类型;然后int或unsigned int会转换为long或unsigned long类型;最后,如果有double类型参与运算,则float类型会转换为double类型。
二. 显式类型转换(强制类型转换)
1. C-style强制类型转换
语法:(type) expression,其中type是要转换的目标类型,expression是要转换的表达式。例如:
double num6 = 3.14; int num7 = (int)num6; // 将double类型的num6强制转换为int类型,结果num7为3(小数部分被截断)
2. static_cast转换
用于基本类型之间的转换,以及具有继承关系的类之间的转换(向上转型是安全的,向下转型需要谨慎)。
基本类型转换示例:
int num8 = 10; double num9 = static_cast<double>(num8); // 将int类型的num8转换为double类型
类的向上转型示例(假设Derived类继承自Base类):
Derived d; Base* b = static_cast<Base*>(&d); // 将Derived类的指针转换为Base类的指针(向上转型)
3. dynamic_cast转换
主要用于具有继承关系的类之间的转换,特别是向下转型(从基类指针或引用转换为派生类指针或引用)。它在运行时进行类型检查,如果转换不安全(例如,基类指针实际上并不指向要转换的派生类对象),则返回nullptr(对于指针类型)或抛出std::bad_cast异常(对于引用类型)。
假设Derived类继承自Base类:
Base* basePtr = new Derived(); Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr!= nullptr) { // 转换成功,可以安全地使用derivedPtr }
4. const_cast转换
用于去除或添加const或volatile限定符。需要注意的是,去除const限定符后修改对象的值可能会导致未定义行为,如果对象本身是定义为const的。
例如:
const int num10 = 5; int& num11 = const_cast<int&>(num10); // 去除了num10的const限定符,但修改num11的值是不安全的行为
5. reinterpret_cast转换
用于进行一些比较底层的、依赖于具体实现的类型转换,例如在指针类型和整数类型之间进行转换,或者不同指针类型之间的转换(这种转换是非常危险的,因为它可能会导致程序出现难以预料的错误)。
例如:
int num12 = 10; void* voidPtr = reinterpret_cast<void*>(&num12); int* num13 = reinterpret_cast<int*>(voidPtr); // 在int指针和void指针之间进行转换
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线