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

如何建一个自己的网站wap网页是什么意思

如何建一个自己的网站,wap网页是什么意思,深圳住建网站,建筑人才网招聘信息More Effective C 条款07:不要重载"&&“、”||“和”,"操作符核心思想:C允许重载大多数操作符,但重载"&&“、”||“和”,"操作符会破坏它们的原生语义,导致意外的行为。这些操作符具有特殊的…

More Effective C++ 条款07:不要重载"&&“、”||“和”,"操作符


核心思想C++允许重载大多数操作符,但重载"&&“、”||“和”,"操作符会破坏它们的原生语义,导致意外的行为。这些操作符具有特殊的求值规则(短路求值、顺序保证),重载后会失去这些特性,因此应该避免重载它们。

🚀 1. 问题本质分析

1.1 内置操作符的特殊语义

  • "&&“和”||"操作符:具有短路求值特性
    • expr1 && expr2:如果expr1为false,expr2不会被求值
    • expr1 || expr2:如果expr1为true,expr2不会被求值
  • ","操作符:保证严格的从左到右求值顺序
    • expr1, expr2:先求值expr1,再求值expr2

1.2 重载后的行为变化

// 重载版本失去特殊语义
class MyType {
public:// 重载&&操作符MyType operator&&(const MyType& rhs) const {// 失去短路求值特性:两边都会求值return MyType(value && rhs.value);}// 重载||操作符  MyType operator||(const MyType& rhs) const {// 失去短路求值特性:两边都会求值return MyType(value || rhs.value);}// 重载,操作符MyType operator,(const MyType& rhs) const {// 失去顺序保证:求值顺序可能改变return rhs; // 通常返回第二个操作数}private:bool value;
};// 使用示例
MyType a(true), b(false), c(true);// 内置版本:短路求值,b()不会被调用
if (a() && b()) { /* ... */ }// 重载版本:两边都会求值,失去短路特性
if (a && b) { /* ... */ } // a和b都会被求值

📦 2. 问题深度解析

2.1 重载操作符 vs 内置操作符

特性内置操作符重载操作符
求值顺序严格定义(从左到右)未定义(编译器决定)
短路求值支持(&&和不支持(两边都会求值)
操作数求值按语言规范严格顺序顺序未指定
函数调用语义不是函数调用实际上是函数调用

2.2 重载带来的问题

// 可能产生意外行为的示例
class FileHandler {
public:FileHandler(const char* filename) {file = fopen(filename, "r");}~FileHandler() {if (file) fclose(file);}explicit operator bool() const {return file != nullptr;}// ❌ 错误:重载&&操作符FileHandler operator&&(const FileHandler& other) const {return FileHandler(nullptr); // 伪实现}private:FILE* file;
};// 使用示例
FileHandler openFile(const char* filename) {return FileHandler(filename);
}// 内置&&:短路求值,安全
if (openFile("a.txt") && openFile("b.txt")) {// 如果第一个文件打开失败,第二个不会尝试打开
}// 重载&&:两边都会求值,可能产生资源泄漏
// 两个文件都会尝试打开,即使第一个失败
if (openFile("a.txt") && openFile("b.txt")) {// 两个文件都被打开了,即使第一个失败
}

⚖️ 3. 解决方案与最佳实践

3.1 替代方案

// 1. 使用明确命名的函数代替操作符重载
class SafeBool {
public:bool isTrue() const { return value; }bool isFalse() const { return !value; }// 提供到bool的显式转换(C++11起)explicit operator bool() const {return value;}// 使用命名函数代替操作符重载SafeBool logicalAnd(const SafeBool& other) const {return SafeBool(value && other.value);}SafeBool logicalOr(const SafeBool& other) const {return SafeBool(value || other.value);}private:bool value;
};// 2. 使用模板函数处理复杂逻辑
template<typename T, typename U>
auto safeAnd(const T& a, const U& b) -> decltype(a && b) {// 可以在这里实现自定义逻辑,但保持短路特性return a && b; // 使用内置操作符
}// 3. 对于逗号操作符,使用分号语句或嵌套函数调用
void doOperations() {// 使用分号保持顺序operation1();operation2();// 或者使用立即调用lambda[&]{operation1();return operation2();}();
}

3.2 正确使用模式

// ✅ 推荐:使用内置操作符的特性
class ResourceGuard {
public:explicit ResourceGuard(Resource* res) : resource(res) {}~ResourceGuard() {if (resource) releaseResource(resource);}// 提供到bool的显式转换explicit operator bool() const {return resource != nullptr;}// 不要重载&&、||和,// 让内置操作符保持其短路特性private:Resource* resource;
};// 正确使用:保持短路求值
ResourceGuard guard1 = acquireResource("a");
ResourceGuard guard2 = acquireResource("b");if (guard1 && guard2) {// 如果guard1获取失败,guard2不会被尝试获取useResources(guard1, guard2);
}

3.3 现代C++增强

// 使用=delete明确禁止重载
class NoOverload {
public:// 允许其他操作符重载NoOverload operator+(const NoOverload&) const;// 明确禁止不希望重载的操作符NoOverload operator&&(const NoOverload&) const = delete;NoOverload operator||(const NoOverload&) const = delete;NoOverload operator,(const NoOverload&) const = delete;
};// 使用概念约束(C++20)
template<typename T>
concept NoLogicalOps = requires(T a, T b) {requires !requires { a && b; }; // 不允许&&操作符requires !requires { a || b; }; // 不允许||操作符requires !requires { a, b; };   // 不允许,操作符
};// 确保类型不重载这些操作符
static_assert(NoLogicalOps<MySafeType>);

💡 关键实践原则

  1. 永远不要重载"&&“和”||"操作符
    保持短路求值特性:

    // ❌ 绝对不要这样做
    // MyType operator&&(const MyType&) const;
    // MyType operator||(const MyType&) const;// ✅ 使用替代方案
    if (obj.isValid() && otherObj.isReady()) {// 保持短路特性
    }
    
  2. 避免重载","操作符
    保持求值顺序确定性:

    // ❌ 避免重载逗号操作符
    // MyType operator,(const MyType&) const;// ✅ 使用分号或嵌套函数调用
    doThis();
    doThat();// 或者
    doThis(), doThat(); // 使用内置逗号操作符
    
  3. 提供明确的bool转换
    使用explicit operator bool():

    class SafeBool {
    public:// ✅ 正确:提供到bool的显式转换explicit operator bool() const {return isValid();}// ❌ 避免:隐式转换操作符(已过时)// operator bool() const { return isValid(); }
    };
    
  4. 使用命名函数代替操作符
    提高代码可读性和安全性:

    class LogicalOps {
    public:// ✅ 使用命名函数LogicalOps and(const LogicalOps& other) const;LogicalOps or(const LogicalOps& other) const;// ✅ 或者使用静态方法static LogicalOps logicalAnd(const LogicalOps& a, const LogicalOps& b);static LogicalOps logicalOr(const LogicalOps& a, const LogicalOps& b);
    };
    

现代C++增强

// 使用=delete明确禁止不安全的操作符重载
class SafeType {
public:SafeType() = default;// 明确禁止不安全的操作符重载SafeType operator&&(const SafeType&) const = delete;SafeType operator||(const SafeType&) const = delete;SafeType operator,(const SafeType&) const = delete;// 允许其他安全的操作符重载SafeType operator+(const SafeType&) const;SafeType operator-(const SafeType&) const;
};// 使用static_assert确保类型安全
template<typename T>
void checkTypeSafety() {static_assert(!std::is_convertible_v<decltype(std::declval<T>() && std::declval<T>()), T>,"Type T should not overload operator&&");static_assert(!std::is_convertible_v<decltype(std::declval<T>() || std::declval<T>()), T>,"Type T should not overload operator||");static_assert(!std::is_convertible_v<decltype((std::declval<T>(), std::declval<T>())), T>,"Type T should not overload operator,");
}// 编译时检查
checkTypeSafety<MyType>();

代码审查要点

  1. 检查代码中是否有重载"&&“、”||“或”,"操作符的情况
  2. 确认布尔类型是否使用explicit operator bool()而不是隐式转换
  3. 验证逻辑操作是否保持了短路求值特性
  4. 检查是否有使用命名函数替代操作符重载的可能性
  5. 确认资源管理代码是否正确利用了短路求值特性

总结
C++允许重载大多数操作符,但重载"&&“、”||“和”,"操作符会破坏它们的特殊语义,导致失去短路求值特性和求值顺序保证。这些操作符的重载会使代码行为与内置类型不一致,可能引入难以发现的bug。应该避免重载这些操作符,而是使用命名函数、显式的bool转换和其他替代方案来实现所需功能。在现代C++中,可以使用=delete明确禁止这些操作符的重载,并使用静态断言在编译时检查类型安全性。保持这些操作符的原生语义对于编写正确、高效和可维护的代码至关重要。

http://www.dtcms.com/a/517702.html

相关文章:

  • 无锡专业做网站的公司哪家好东莞百度seo服务公司
  • 像素策略游戏:资源战争
  • 个人网站如何做流量网站qq代码生成
  • 佛山模板建站软件动态个人网站模板
  • 搭建个人博客网站网站建设了推广方案
  • 南海小程序网站开发惠安网站建设报价
  • 厦门市建设工程在哪备案网站制定 网站改版优化方案
  • 【生物大模型文章精读实践七】HyenaDNA与Transformer的简单比较实践
  • 东莞网站建设公司辉煌大厦东营 微信网站建设
  • 网站开发自学还是培训wordpress与thinkphp
  • SuperSonic Text2SQL:智能自然语言转SQL解析引擎
  • 网站关键词标题怎么写oa厂家排名
  • 华为FreeClip2小艺唤醒功能如何开启?
  • 蓝众建站_专业网站建设网站建设明细报价单
  • 做推广用的网站郑州cms建站模板
  • 网站开发薪水一般多少开发公司移交柴油发动机需要具备哪些条件
  • 武陟住房和城乡建设局网站门户网站通俗理解
  • 宁波网站排名公司东莞市建设网网上办事平台
  • 网站建设规划任务书微信朋友圈广告如何投放
  • 文件操作知识
  • 怎样只做自己的网站茂名放心营销网站开发
  • 图片链接生成网站网站开发人员调试
  • 【开题答辩实录分享】以《自然历史博物馆藏品管理系统》为例进行答辩实录分享
  • 方案查一查网站工程咨询公司
  • 苏州专业设计网站金口河移动网站建设
  • 企业网站建设费用财务处理做的公司网站怎么没了
  • 珠海市住房建设局网站网站网页设计怎么报价
  • wordpress毕设如何建设和优化一个网站
  • 镜像网站怎么做产品画册
  • 模版进阶,咕咕咕!