• C++禁用赋值操作符


    1.禁用赋值操作符

    在C++中,void operator=(const ClassName&) = delete; 是一种特殊的语法,用于明确地禁止赋值操作符(assignment operator)的默认实现或自定义实现。

    这通常用于防止类的实例被意外赋值。通过明确地删除赋值操作符,你可以确保编译器在尝试使用赋值操作时生成编译错误,从而避免潜在的错误或误用。

    这是一个例子:

    class NonAssignable {
    public:
        NonAssignable() = default;
        NonAssignable(const NonAssignable&) = delete;
        NonAssignable& operator=(const NonAssignable&) = delete;
    };
    
    int main() {
        NonAssignable a;
        NonAssignable b;
        
        a = b;  // 这行代码将产生编译错误,因为赋值操作符已被删除
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这个例子中,NonAssignable 类是不可赋值的,因为赋值操作符已被明确删除。尝试对 NonAssignable 类型的对象进行赋值将导致编译错误。

    2.禁用移动赋值操作符

    void operator=(TypeName&&) = delete; 是C++中的语法,用于明确地禁止移动赋值操作符(move assignment operator)的默认实现或自定义实现。

    这与删除复制赋值操作符类似,但是针对的是移动赋值操作。移动语义在C++11及以后的版本中引入,允许资源从一个对象转移到另一个对象,通常可以提高性能。

    当你删除移动赋值操作符时,意味着你不允许该类的对象进行移动赋值。尝试这样做将导致编译错误。

    以下是一个示例:

    class NonMoveAssignable {
    public:
        NonMoveAssignable() = default;
        NonMoveAssignable(NonMoveAssignable&&) = delete;
        NonMoveAssignable& operator=(NonMoveAssignable&&) = delete;
    };
    
    int main() {
        NonMoveAssignable a;
        NonMoveAssignable b;
        
        a = std::move(b);  // 这行代码将产生编译错误,因为移动赋值操作符已被删除
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这个例子中,NonMoveAssignable 类是不可移动赋值的,因为移动赋值操作符已被明确删除。尝试对 NonMoveAssignable 类型的对象进行移动赋值将导致编译错误。

  • 相关阅读:
    通过玩游戏学会AWS
    Spring Cache组件
    执法装备管理系统DW-S304的概念与特点
    矩阵账号搭建流程,3步学会,直接拿去用即可
    8.spring框架-----AOP基本知识
    【python】(二十) python装饰器
    分数限制下,选好专业还是选好学校?
    苹果iOS系统开发APP应用启动几种速度优化技巧与实践
    【达梦数据库】mysql函数改写达梦
    Java 环境变量配置
  • 原文地址:https://blog.csdn.net/gyqJulius_Caesar/article/details/133887233