当前位置: 首页 > news >正文

C++类型转换机制详解

C++类型转换机制详解

C++提供了四种显式类型转换运算符和一种隐式转换机制。理解不同转换方式的用途和限制对于编写安全的代码至关重要。

static_cast用于编译时已知的安全转换。

#include

void static_cast_example() {
int i = 10;
double d = static_cast(i);
std::cout << "int to double: " << d << "\n";

double pi = 3.14159;
int truncated = static_cast(pi);
std::cout << "double to int: " << truncated << "\n";

void* ptr = &i;
int* int_ptr = static_cast(ptr);
std::cout << "void* to int*: " << *int_ptr << "\n";
}

dynamic_cast用于运行时类型检查,只能用于多态类型。

class Base {
public:
virtual ~Base() = default;
virtual void identify() const {
std::cout << "Base\n";
}
};

class Derived : public Base {
public:
void identify() const override {
std::cout << "Derived\n";
}

void derived_method() {
std::cout << "Derived-specific method\n";
}
};

void dynamic_cast_example() {
Base* base_ptr = new Derived();

Derived* derived_ptr = dynamic_cast(base_ptr);
if (derived_ptr) {
derived_ptr->derived_method();
}

Base* base_only = new Base();
Derived* failed_cast = dynamic_cast(base_only);
if (!failed_cast) {
std::cout << "Cast failed as expected\n";
}

delete base_ptr;
delete base_only;
}

const_cast用于添加或移除const限定符。

void modify_through_const_cast(const int* ptr) {
int* mutable_ptr = const_cast(ptr);
*mutable_ptr = 100;
}

void const_cast_example() {
int x = 42;
const int* const_ptr = &x;

std::cout << "Before: " << x << "\n";
modify_through_const_cast(const_ptr);
std::cout << "After: " << x << "\n";
}

reinterpret_cast用于低级别的位模式重新解释。

void reinterpret_cast_example() {
int i = 65;
char* char_ptr = reinterpret_cast(&i);
std::cout << "First byte: " << *char_ptr << "\n";

long long address = reinterpret_cast(&i);
std::cout << "Address as number: " << std::hex << address << "\n";
}

隐式类型转换由编译器自动执行。

class Integer {
int value_;

public:
Integer(int v) : value_(v) {
std::cout << "Converting " << v << " to Integer\n";
}

operator int() const {
std::cout << "Converting Integer to int\n";
return value_;
}
};

void implicit_conversion() {
Integer i = 42;
int x = i;
std::cout << "Value: " << x << "\n";
}

explicit关键字防止隐式转换。

class ExplicitInteger {
int value_;

public:
explicit ExplicitInteger(int v) : value_(v) {}

explicit operator int() const {
return value_;
}

int value() const { return value_; }
};

void explicit_conversion() {
ExplicitInteger ei(42);
int x = static_cast(ei);
std::cout << "Value: " << x << "\n";
}

类型转换是C++中强大但危险的特性,应该谨慎使用,优先选择最安全的转换方式。

http://www.jsqmd.com/news/866647/

相关文章:

  • AI自动剪视频发抖音”
  • Navicat Premium试用重置终极指南:三步恢复完整14天试用期
  • 装修前我想先画个3D模型,结果在浏览器里搭出了一套完整的房子
  • 合并的 Sentinel-3A 和 Sentinel-3B OLCI 区域分箱内陆水域 (ILW) 数据,版本 5.0
  • UEFITool 0.28:掌握UEFI固件解析与修改的终极实战指南
  • 收藏 | 从提示词小白到AI大模型开发者:企业级应用开发实战指南
  • 对比按量计费与Token Plan套餐,如何选择更划算的消费模式
  • 医疗私有化算力场景痛点解析:算力孤岛、资源分配与运维管控难题如何破解?
  • 【智能体漫游】用AI“团队“批量生产小红书爆款笔记?我差点被这个Multi-Agent系统卷哭了
  • 学术写作效率革命!2026全能型AI论文网站终极指南
  • AI 驱动知识引擎与智慧教学科研平台:让沉睡的文献“开口说话”
  • 配镜验光时要注意什么
  • 免费开源桌面定制神器:Rainmeter让你的Windows桌面焕然一新的终极指南
  • 有哪些AI论文软件是真的懂学术语言,而不是胡乱堆砌?
  • 【AI】win10 agent机器人工具
  • 电子合同怎么签?看这一篇真够了!
  • 微软Maia 200的“算力经济学”:推理时代的专用芯片如何改写游戏规则
  • 昇腾CANN cann-recipes-infer:LLM 推理部署的完整菜谱
  • 泉盛UV-K5/K6开源固件深度技术解析与进阶配置实战手册
  • Yolov8-pose关键点检测:TIP2026 FourierSR | FourierSR引入YOLO C2f:解决感受野局限,实现高效全局特征交互
  • FreeACS实战指南:构建企业级TR-069自动配置服务器的专业方案
  • 压缩包加密 vs 透明加密:企业文档保护选哪个?
  • ElegantBook:5分钟掌握专业书籍排版的终极LaTeX解决方案
  • 3分钟极速上手:网盘直链解析工具使用全攻略
  • 体验taotoken新用户活动价在初期项目原型开发中的成本优势
  • 同城矩阵系统的中心地密码:用克里斯塔勒中心地理论和引力模型,解释为什么你的10个探店号加起来,还不如别人3个
  • 用扩散模型“一次生成图像和标注”:CoSimGen 如何实现可控的图像-Mask 同步生成
  • 为我的自动化Agent工作流配置Taotoken作为统一模型网关
  • 政法行业 AI 知识图谱,赋能政法数字化智能化升级
  • 如何快速使用AutoLegalityMod:宝可梦数据自动生成与合法性验证完全指南