新闻详情

新闻详情

首页 / 资讯中心 / 详情

深入理解C++ 重载 <十二> 重载按位与运算符

发布时间:2026/10/2 20:08:52来源:尧图网络
深入理解C++ 重载 <十二> 重载按位与运算符
C 重载按位与运算符operator详解一、什么是按位与运算符的重载C 中的是一个二元运算符默认对整数执行按位与cppint a 0b1100; int b 0b1010; int c a b; // 0b1000和、-、|一样也可以被重载让用户自定义类型也能用运算。cppclass T { public: T operator(const T rhs) const { // 返回一个新的 T } };调用形式cppT x, y; T z x y; // 等价于 x.operator(y)二、为什么按位与的重载比取地址安全得多对比一元operator取地址二元operator的重载要温和很多对比项一元operator二元operator破坏语言假设是地址语义否影响标准库严重无常见性极少较常见推荐度强烈不建议视场景而定二元operator只是一个普通运算符重载和operator完全对等不会破坏语言机制。三、典型应用场景场景说明位标志 (bit flags)Permissions、FileMode等组合与查询集合运算用位图表示集合表示交集DSL / 表达式模板构建查询表达式如filter condition矩阵/向量按元素与数值计算库中按元素逻辑与智能位集类自定义bitset风格的类其中位标志是最经典、最实用的场景。#include iostream #include string // 权限标志用无符号整数表示每一位 enum class Perm : unsigned { None 0, Read 1u 0, // 001 Write 1u 1, // 010 Execute 1u 2, // 100 }; // 权限集合类 class Permissions { public: // 默认构造无权限 Permissions() : bits_(0) {} // 从单个权限构造 Permissions(Perm p) : bits_(static_castunsigned(p)) {} // 从原始位构造显式避免隐式转换 explicit Permissions(unsigned bits) : bits_(bits) {} // 重载按位与 // 语义返回两个权限集合的交集 Permissions operator(const Permissions rhs) const { return Permissions(bits_ rhs.bits_); } // 重载按位与赋值 Permissions operator(const Permissions rhs) { bits_ rhs.bits_; return *this; } // 顺带重载 | 和 | Permissions operator|(const Permissions rhs) const { return Permissions(bits_ | rhs.bits_); } Permissions operator|(const Permissions rhs) { bits_ | rhs.bits_; return *this; } // 转 bool非空即可判断为 true explicit operator bool() const { return bits_ ! 0; } // 判断是否包含某个权限 bool has(Perm p) const { return (bits_ static_castunsigned(p)) ! 0; } unsigned raw() const { return bits_; } private: unsigned bits_; }; // 让 Permissions Perm 也能用对称性 inline Permissions operator(Permissions lhs, Perm rhs) { return lhs Permissions(rhs); } int main() { // 组合Read | Write Permissions rw Permissions(Perm::Read) | Permissions(Perm::Write); std::cout rw.bits rw.raw() \n; // 3 // 1) 用 求交集rw Read Permissions onlyRead rw Permissions(Perm::Read); std::cout onlyRead.raw onlyRead.raw() \n; // 1 // 2) 用 if (p mask) 做权限检查 if (rw Permissions(Perm::Read)) { std::cout 有读权限\n; } if (!(rw Permissions(Perm::Execute))) { std::cout 没有执行权限\n; } // 3) 用 has() 更直观 std::cout has(Write)? rw.has(Perm::Write) \n; // 1 std::cout has(Execute)? rw.has(Perm::Execute) \n; // 0 // 4) 用 原地取交集 Permissions p Permissions(Perm::Read) | Permissions(Perm::Write); p Permissions(Perm::Read); std::cout p.raw p.raw() \n; // 1 return 0; }
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

频率域图像处理核心:傅里叶变换、频域滤波与同态滤波全解析 2026/10/2 21:58:12

频率域图像处理核心:傅里叶变换、频域滤波与同态滤波全解析

数字图像处理这门课,理论上讲,前几章再零碎,大家照着例题还是能把作业写出来的。但到了第四章频率域图像处理,大多数人的反应会突然慢下来:坐标系成了 u、v,图像变成了复数矩阵,之前积累的线性代…

阅读更多 →
YOLOv8垃圾分割检测系统:端到端实例分割实战指南 2026/10/2 21:58:12

YOLOv8垃圾分割检测系统:端到端实例分割实战指南

简介:YOLOv8垃圾分割检测系统是一套面向人工智能初学者与计算机视觉实践者的轻量级垃圾分类解决方案,聚焦图像识别与实例分割任务,适用于智能环卫、环保监测及课程设计等场景。资源包共41个文件,含15张JPG/PNG格式的样本图像、3个…

阅读更多 →
PowerShell禁止运行npm.ps1?一条命令解决Node.js脚本执行策略报错 2026/10/2 21:58:12

PowerShell禁止运行npm.ps1?一条命令解决Node.js脚本执行策略报错

在PowerShell里输入 npm -v ,回车,终端弹出一段红字:“npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 about_Execution_Policies。”这句话我见过太多次了。毫不夸张地说&…

阅读更多 →
Flutter鸿蒙化实战:hider库属性级显隐适配与RenderObject重构 2026/10/2 21:58:12

Flutter鸿蒙化实战:hider库属性级显隐适配与RenderObject重构

做过中后台 Flutter 客户端的朋友应该都有印象:权限点一多,页面里最难看的部分根本不是业务逻辑,而是“这个按钮要不要显示”“这块文案什么时候出现”这类显隐判断。我之前维护的一个运营后台,光 if (user.hasPermission(xxx)) …

阅读更多 →
汽车造型评审的XR头显选型:六大标准与实测指南 2026/10/2 21:58:11

汽车造型评审的XR头显选型:六大标准与实测指南

如果你所在的造型设计团队,目前还在靠大屏渲染图和油泥模型做评审,我可以负责任地告诉你:XR头显带来的信息密度提升是实打实的。1:1沉浸式看车、多方案快速切换、跨地多人评审,这些在几年前还要靠搭十几个显示器或者反复做油泥模型…

阅读更多 →
3x-ui 面板部署实战:从安装到安全加固的完整教程 2026/10/2 21:58:04

3x-ui 面板部署实战:从安装到安全加固的完整教程

3x-ui 这个名字,玩 Linux 服务器的人应该不陌生。最近我又重新部署了一台机器,翻了一圈开源管理面板,最后还是装回了 3x-ui。很多朋友第一次听说它,都是奔着“安装 3x-ui”这个关键词来的,想找一篇能照着一步步做完的文…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉