• 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 类型的对象进行移动赋值将导致编译错误。

  • 相关阅读:
    软考2020高级架构师下午案例分析第4题:关于Redis数据类型、持久化、内存淘汰机制
    OB_GINS_day3
    微服务网关之Zuul下
    端口映射的几种常见应用场景
    开源软件的崛起:历史与未来
    常用的Visual Studio快捷键
    idea无法识别加载pom.xml文件
    CentOS7.6安装docker
    《福布斯》:想要创建更好的代码?遵循这 14 个步骤
    CentOS7用yum安装MySQL8.0 2209170054
  • 原文地址:https://blog.csdn.net/gyqJulius_Caesar/article/details/133887233