ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

深入理解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; }
返回列表